参数入栈顺序和计算顺序

原创 2011年01月12日 23:35:00

int main()
{
   
    int i = 1;
    printf("%d/n%d/n%d/n", i, i++, ++i); 
       

   
    return 0;
}

在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()
{
    int i = 1;
    printf("%d/n%d/n%d/n", i, (++i)+(++i)+(i++), ++i);      

   
    return 0;
}

在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)

关于函数参数入栈的思考(函数调用约定,入栈顺序)

要实现函数调用,除了要知道函数的入口地址外,还要向函数传递合适的参数。向被调函数传递参数,可以有不同的方式实现。这些方式被称为“调用规范”或“调用约定”。C/C++中常见的调用规范有__cdecl、_...
  • K346K346
  • K346K346
  • 2015年08月10日 17:16
  • 3273

为什么C/C++的参数入栈顺序是从右向左?

相关连接 (1)http://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html (2)http://bbs.csdn.net...
  • hnyzyty
  • hnyzyty
  • 2015年06月09日 15:20
  • 937

C++函数参数的入栈顺序

长期以来大家都有一个疑问,C++函数参数的入栈顺序倒底是怎样的呢? 经验丰富的程序员一定会说C++参数的传输顺序是从右到左的, 这一点大家不妨可以自己建立一个控制台程序,看看函数入参的栈地址,你...
  • u012329294
  • u012329294
  • 2013年10月08日 19:28
  • 1268

根据入栈顺序输出所有可能的出栈顺序 (Java)

某次面试被问到的一个题,当场答得不是很好,所以回来记录一下比如入栈顺序是1,2,3,那么出栈顺序分别可以是1,2,3;1,3,2;…. import java.util.Stack; public c...
  • b7771253
  • b7771253
  • 2016年09月11日 18:13
  • 2146

出入栈顺序可能性

N个数据进栈有(C(2n,n)/(n+1) [C(n,m)表示n选m的组合数].)种出栈方案。具体分析如下: 对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态...
  • qxc10086
  • qxc10086
  • 2015年08月23日 14:56
  • 539

函数调用过程中,函数参数的入栈顺序

函数调用过程中,第一个进栈的是(主函数中的)调用处的下一条指令(即函数调用语句的下一条可执行语句)的地址;然后是函数的各个参数,而在大多数C/C++编译器中,在函数调用的过程中,函数的参数是由右向左入...
  • lixiang212121
  • lixiang212121
  • 2015年05月05日 22:09
  • 2753

调用约定的参数传递顺序

都是学习过程中做的笔记。在编程的过程中,函数是必不可少的基础之一。c语言的程序完全由函数构成,所有的代码都在某一个函数中;pascal区分函数和过程,但是本质是类似的。而对计算机硬件而言CPU只关心一...
  • evi10r
  • evi10r
  • 2010年08月06日 21:31
  • 1123

顺序进栈乱序出栈的所有可能顺序之算法

题目:设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的车站,具体写出这四辆 列车开出车站的所有可能的顺序。 今天看到这个数据结构练习题,一开始认为只有穷举然后验证的方法。 习题后面给出的...
  • lm19880204
  • lm19880204
  • 2016年07月22日 15:48
  • 2346

由入栈123出栈顺序引发的思考

由入栈123出栈顺序引发的思考 最近在看数据结构,一道题引起了我的注意。 目录 由入栈123出栈顺序引发的思考    1 1、题    1 2、栈的理解    1 3、由题引发的思考    2...
  • cszhang570221322
  • cszhang570221322
  • 2016年12月22日 13:50
  • 1504

根据已知入栈顺序判断一个数组是否是出栈顺序

题目含义已经很明确了,现在开始使用一个样例输入和输出 int a[]={1,2,3,4,5};//原始的入栈顺序 int b[]={4,5,3,1,2};//出栈顺序 int b1[]={4,5...
  • dasgk
  • dasgk
  • 2015年07月20日 08:37
  • 794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:参数入栈顺序和计算顺序
举报原因:
原因补充:

(最多只允许输入30个字)