为了知道函数调用过程中实参的求值顺序、形参与实参间数据传递的具体操作及系统的内存分配,我参照谭浩强《c程序设计》(第三版)中P162,例8.4进行了实验,以下是c语言与对应反汇编的程序及分析:
#include<stdio.h> //用于查看函数参数求值、参数传递及局部变量的内存分配
void print(int a, int b); //同一函数的声明有很多个,不没有提示错误
void print(int a, int b);
void main()
{
int i = 1;
{
int i = 2; //在{}允许再定义变量,但{}内不能重名
int *ip = &i;
}
print(i,++i); //
print(1,2);
getchar();
}
void print(int a, int b)//打印a,b的值
{
int d;
d=a+b;
printf("%d,%d,%d\n",a,b,d);
}
输出结果为:
这是因为{}内定义的局部变量作用域只在{}内,因而对于print函数调用时,i的初始值应该为1;然后先进行参数求值,从右开始,++i 其实就是i = i +1,因而实参还是i,i=2,而左边的参数也是i,i=2,所以输出的结果是2,2,4,下面是相应反汇编代码
****************************************************************