代码段:
问题1: 参数入栈顺序
问题2: add函数结束时,x,y变量被释放了吗
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include int add(int x, int y) { return x + y; } int main() { int a = 10, b = 20; int c = add(a,b); system("pause"); return 0; }
1、在主调函数和被调函数之间,要遵循一致的约定,才能保证正确传参被使用,这一约定称之为调用惯例
2、调用惯例
首先明确c程序,栈底为高地址,栈顶为低地址.
在c/c++程序中,默认的调用惯例为_cdecl,即上述被调函数add()的完整表达为:
int _cdecl add (int x, int y)
参数传递为从右往左,而出栈顺序刚好相反,正好取参数相匹配.而由主调函数决定栈变量的释放.
关于函数名字修饰无须了解.
举个例子:
#includeint main() { int a = 2; printf("%d %d %d %dn",a++,++a,a++,a); return 0; }
输出结果应该是 4 5 2 5
解释如下:
参数入栈为从右往左 :
经过三次自加运算,a的值为5,所有++a的值和a的值都被更新为5,a++的值保持不变
关于为什么++a和a的值会被更新而a++的值不会更新,这是别人的解释:
对于a++的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作.



