從彙編層次理解 i 與 i 的區別

2021-08-09 22:23:38 字數 1136 閱讀 8413

i++

與++i最大的區別就是:

i++:先取值後自加;

++i:先自加後取值。

執行**:

#include int main()

運用debug除錯的反彙編檢視彙編**,如下:

int main()

0016149d pop edi

0016149e pop esi

0016149f pop ebx

001614a0 add esp,0d4h

001614a6 cmp ebp,esp

001614a8 call @ilt+315(__rtc_checkesp) (161140h)

001614ad mov esp,ebp

001614af pop ebp

001614b0 ret

函式傳參過程:c++沿用c的引數傳遞方式,是從右到左傳遞的,即從第三個引數,到第二個引數,再到第乙個引數,依次執行相應操作,然後依次壓棧。

下圖為main函式中

printf("%d,%d,%d\n",i++,--i,i++);

給printf函式傳參的彙編**的詳解:

(右鍵全屏看高畫質大圖)

最後printf列印的值為:0, 1, 0

結論:i++在函式壓棧過程前:

1,先取記憶體資料段i的值,存入乙個臨時量中;

2,然後進行自加,再寫入記憶體資料段的i中;

3,等待所有引數運算完成後,最後壓棧時,將儲存的臨時量的值進行壓棧。

++i在函式壓棧過程前:

1,直接取記憶體資料段的i值,進行自加,再寫入記憶體資料段的i中;

2,等待所有引數運算完成後,最後壓棧時,直接取記憶體資料段的

i值進行壓棧。

i 與 i的區別

public class test static int x,y public static void main string args public static void mymethod 選項 compiletime error prints 1 prints 2 prints 3 print...

i 與 i的區別

今天在寫題的時侯在 i與i 上遇到了麻煩,具體就是我在寫乙個迴圈語句時因為沒有弄清楚i 與 i的區別而導致的錯誤。之前對於i 與 i的使用都只侷限於如下方式 for j 2 j 9 j for j 2 j 9 j 這樣使用好像兩者並沒有什麼區別。然而當我像下面這樣用時卻出了問題 for j i,t ...

談談i 與 i的區別

在通常情況下i 與 i是一樣的,可以等價替換的,例如在for迴圈裡 for int i 0 i 10 i 與for int i 0 i 10 i 是一樣的 但是也用不同的地方 int flag 0 for int i 0 i 10 i num flag i 先賦值 後flag加一 與for int ...