詳細解析i 與 i

2021-05-25 05:04:14 字數 1248 閱讀 6387

i++與++i是特殊的自增運算,類似的還有自減操作運算i--與--i。下面從c與c++兩個角度來比較這兩種形式的運算方式。

1.c中

簡單的地說,++i和i++,作為乙個語句單獨使用時(如i++;或者++i;),就是i = i + 1,它們之間沒有區別。而在作為語句的一部分時,a = ++i相當於i = i + 1; a = i;通過表示式就可以看出,因為++在前,所以是先執行加1操作,再執行賦值操作。而a = i++相當於a = i; i = i + 1;++在後,所以是先執行賦值操作,再執行加1操作。

問題:試分析下面的**在x86/linux上的輸出結果。

**1:

結果:x86/linux:7,9; sparc/solaris6,6

在x86/linux平台上專門有一條指令用於++i操作,那就是inc指令。inc指令直接對i進行加1操作,並將結果儲存在i中,而不是暫存器中,而在sparc/solaris系統上,由於不存在inc指令,計算的結果將儲存在暫存器中,因此運算結果為6。

下面來分析一下在x86/linux上發生了什麼:

(++i) + (++i) + (++i) 

++i:i = 1; 

++i:i = 2; 

((++i) + (++i)):i = 2;((++i) + (++i)) = 4 

((++i) + (++i) + (++i)):i = 3;(((++i) + (++i)) + (++i)) = 3 + 4 = 7

(++i) + ((++i) + (++i)) 

++i:i = 1; 

++i:i = 2; 

++i:i = 3; 

((++i) + (++i)):i = 3;((++i) + (++i)) = 6 

(++i) + ((++i) + (++i)):i = 3;(++i) + ((++i) + (++i)) = 3 + 6 = 9

2.c++中

在c++中,簡單型別的i++和++i與c相同。但由於在c++中可以過載運算子,所以在實現新的型別物件時過載i++和++i操作與c不同。例如:

從上面的++i與i++的實現看出,在c++中,對於非內建型別來說,前自增運算(++i)返回的是物件的引用,而後自增運算返回的是物件,返回物件將造成成拷貝建構函式更多的呼叫,所以++i的效率要高於i++。但是對於內建型別,i++與++i的效率幾乎沒有區別(因為內建型別沒有拷貝建構函式)。於此類似的是i--和--i。(注:因為後自增運算返回的是const型物件因此後自增運算不能做左值)。

(—完—)

自增 i與i 自減 i與i

a 前置自增 變數值先 1,再計算表示式的值 前自增,先增再用 a 後置自增 先計算表示式的值 變數值後 1 後自增,先用再增 a 後置自減 先計算表示式的值 變數值後 1 後自減,先用再減 a 前置自減 變數值先 1,再計算表示式的值 前自減,先減再用 當自增自減遇上邏輯與和邏輯或 因邏輯與一非即...

深入解析 i

最近遇到乙個面試題,關於 i 的。發現一直沒有深究 i 的原理,有點不知所措,幾天還是決定記錄一下,希望能幫助到別人吧 我不信全球就我乙個搞不清楚 題目如下 的執行結果,留下你的答案吧。public static void main string args 解析在不懂其中原理的情況,得到的答案是千奇...

i 與 i(i 與 i同理)

1.單獨用時,是一樣的,i 等同於 i 相當於i i 1 若賦值時,a i 相當於a i i i 1 而a i 相當於i i 1 a i 2.for迴圈中,i 等同於 i 如 for i 0 i 10 i for i 0 i 10 i 而在while迴圈中,有區別 如 while count whi...