引數入棧順序和計算順序

2021-05-24 02:37:28 字數 2669 閱讀 4400

int main()

在vs2008下輸出3 2 3。

部分彙編**如下:

int i = 1;

00418aae  mov         dword ptr [i],1 //i=1

printf("%d/n%d/n%d/n", i, i++, ++i);

00418ab5  mov         eax,dword ptr [i]

00418ab8  add

eax,1

00418abb  mov         dword ptr [i],eax //i = i+1=2

00418abe  mov         ecx,dword ptr [i]

00418ac1  mov         dword ptr [ebp-0d0h],ecx //臨時變數等於2

00418ac7  mov         edx,dword ptr [i]

00418aca  add         edx,1

00418acd  mov         dword ptr [i],edx //i = i+1=3

00418ad0  mov         esi,esp

00418ad2 mov         eax,dword ptr [i]

00418ad5  push        eax  //i入棧,第三個引數不是++i麼,為什麼?

00418ad6  mov         ecx,dword ptr [ebp-0d0h]

00418adc  push        ecx  //臨時變數入棧

00418add  mov         edx,dword ptr [i]

00418ae0  push        edx  //i入棧

00418ae1  push        offset string "%d/n%d/n%d/n" (41ba24h)

00418ae6  call        dword ptr [__imp__printf (4204c4h)]

00418aec  add         esp,10h

00418aef  cmp         esi,esp

00418af1  call        @ilt+885(__rtc_checkesp) (41137ah)

先從右往左求值,後又從右往左引數入棧。

再如:int main()

在vs2008下輸出5 12 5。

部分彙編**如下:

00418aae  mov         dword ptr [i],1

printf("%d/n%d/n%d/n", i, (++i)+(++i)+(i++), ++i);

00418ab5  mov         eax,dword ptr [i]

00418ab8  add         eax,1

00418abb  mov         dword ptr [i],eax

00418abe  mov         ecx,dword ptr [i]

00418ac1  add         ecx,1

00418ac4  mov         dword ptr [i],ecx

00418ac7  mov         edx,dword ptr [i]

00418aca  add         edx,1

00418acd  mov         dword ptr [i],edx

00418ad0  mov         eax,dword ptr [i]

00418ad3  add         eax,dword ptr [i]

00418ad6  add         eax,dword ptr [i] //為什麼呢?

00418ad9  mov         dword ptr [ebp-0d0h],eax

00418adf  mov         ecx,dword ptr [i]

00418ae2  add         ecx,1

00418ae5  mov         dword ptr [i],ecx

00418ae8  mov         esi,esp

00418aea  mov         edx,dword ptr [i]

00418aed  push        edx 

00418aee  mov         eax,dword ptr [ebp-0d0h]

00418af4  push        eax 

00418af5 mov         ecx,dword ptr [i]

00418af8  push        ecx 

00418af9  push        offset string "%d/n%d/n%d/n" (41ba24h)

00418afe  call        dword ptr [__imp__printf (4204c4h)]

00418b04  add         esp,10h

00418b07  cmp         esi,esp

00418b09  call        @ilt+885(__rtc_checkesp) (41137ah)

合法入棧順序

題目描述 我們知道,乙個入棧序列是的合法出棧序列有,等,而是不合法的.現在冰語有乙個長度為n的序列a 保證序列內數字唯一,且1 a i n 他想知道這個序列是不是入棧順序的合法出棧序列,你能告訴他麼?輸入 第一行為t,表示樣例個數 每個樣例第一行為n,第二行為n個數 1 t 1e4,3 n 100 ...

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...