C++複習整理---i++和++i

DannieG發表於2020-10-13

理論上++i更快,實際與編譯器優化有關,通常幾乎無差別。

//i++實現程式碼為:                                    
int operator++(int)                                  
{
    int temp = *this;                                     
    ++*this;                                             
    return temp;                                    
}//返回一個int型的物件本身
// ++i實現程式碼為:
int& operator++()
{
    *this += 1;
    return *this;
}//返回一個int型的物件引用

簡單從返回的值來說,i++返回的是i的值,而++i返回的是i+1的值。

從返回的東西來說,++i返回的是i的引用,i是什麼值反映出來就是什麼值。可以不停巢狀++(++i)。而且可以(++i) = 5;,就是把i的值改為5。可以&(++i)取i的地址空間。而i++就不行,就會報錯,因為i++相當於只是返回一個值,沒有實體,就不能這樣做,也不能巢狀。

	int i = 0;
	cout<<++i<<endl<<++i<<endl;	//2 2 
	cout<<++i<<endl<<i++<<endl;	//4 2 
	cout<<i++<<endl<<i++<<endl; //5 4
	cout<<i++<<endl<<++i<<endl;	//7 8

首先是函式的入棧順序從右向左入棧的,計算順序也是從右往左計算的,不過都是計算完以後在進行的壓棧操作,所以輸出是按順序的,只是計算順序是反的:

第一行輸出:首先執行++i,返回值是i,這時i的值是1,再次執行++i,返回值是i,得到i=2,將i壓入棧中,此時i為2,也就是壓入2,2;因為++i返回的是引用,所以前一個的i是2.

第二行輸出:首先執行i++,返回值是原來的i,也就是2,再執行++i,返回值是i,依次將2,4壓入棧中得到輸出結果

第三行:首先執行i++,返回值是原來的4,再執行i++返回值是原來的5,依次將4,5壓入棧中得到輸出結果

第四行:首先執行++i,返回i,此時i為7,再執行i++,返回值是原來的7,此時i為9,依次將i,8也就是9,8壓入棧中,得到輸出結果。

理解的時候就是++i是把i壓入棧,i是什麼值就是什麼值。i++是把傳入時i的值壓入棧,是加之前的值,且不會改的。

相關文章