C++複習整理---i++和++i
理論上++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的值壓入棧,是加之前的值,且不會改的。
相關文章
- C++中的i++和++i你真的理解嗎?C++
- 圖解i++和++i圖解
- 每天學點C++知識:用 ++i 替代 i++C++
- 關於java中的i++和++iJava
- 位元組碼指令分析 ++i 和 i++
- synchronized下的 i+=2 和 i++ i++執行結果居然不一樣synchronized
- java中i=i++的問題Java
- c語言中i++與++i的使用技巧C語言
- 好程式設計師web前端教程分享初學者搞懂i++和++i程式設計師Web前端
- jvm是如何執行i = i++ + ++i的,你知道嗎?JVM
- JAVA的i++, i+=1, i=i+1有區別嗎?Java
- 一個關於 i++ 和 ++i 的面試題打趴了所有人面試題
- c# for(int i;i<3;i++)迴圈的執行次序C#
- Java中 i=i++ 問題底層原理解析Java
- C/C++複習C++
- python 中的i++ ,邏輯表示式Python
- 【課件整理複習】Hadoop-第7講 Hadoop的I/O操作Hadoop
- 在XSL裡執行類似for(i=0;i〈x;i++)的迴圈 (轉)
- 面試官又整新活,居然問我for迴圈用i++和++i哪個效率高?面試
- C++複習考點C++
- C++複習筆記C++筆記
- C++模板類複習C++
- 7.6-----複習C++C++
- 【C++複習】棧-上篇C++
- 美團一面問我i++跟++i的區別是什麼
- Java變數自增表示式 i = i++ 的底層邏輯(簡述)Java變數
- Java基礎複習,整理知識點Java
- 一個程式設計師的Java和C++學習之路(整理)程式設計師JavaC++
- 【C++基礎複習01】結構體和連結串列C++結構體
- 面試題【1】:i++是否原子操作?並解釋為什麼?面試題
- C#自增運算子詳解:++i與i++的區別及應用場景C#
- [c++] 繼承和多型整理二C++繼承多型
- C++期末複習資料 備考C++
- C++智慧指標模板類複習C++指標
- c++ I/OC++
- C++整理1C++
- C++整理2C++
- reduce()方法的學習和整理