代码疑云(2)-c函数调用约定

1.	#include<iostream>  
2.	using namespace std;  
3.	void foo(int p1,int p2,int p3)  
4.	{  
5.	  cout<<"p1="<<p1<<endl  
6.	      <<"p2="<<p2<<endl  
7.	      <<"p3="<<p3<<endl;  
8.	}  
9.	int main()  
10.	{  
11.	  int i;  
12.	  cout<<"first call:"<<endl;  
13.	  i=0;  
14.	  foo(++i,++i,++i);  
15.	  cout<<"second call:"<<endl;  
16.	  i=0;  
17.	  foo(++i,i++,i++);  
18.	  return 0;  
19.	}  

:两次调用foo函数分别输出了什么,为什么?

解答:按照cedel函数调用的约定,编译器使参数从左到右的入栈。第一次调用为什么p1,p2,p3的值全是3呢,原因在此,在foo被call之前三++i 操作将先被操作也就是连续自增了3次,最终结果i 的值是3,然后是编译器push(i),push(i),push(i)三次入栈,然后call到foo定义处依次出栈并相应地复制给了形参。第二次调用foo时,一开始与第一次一样先是计算三次++操作,但是所不同的是最后两个是i++,i++ 刚没说到它们的计算顺序,编译器计算这些的顺序是由右到左的,也就是先i++,再i++,最后是++i,而运算i++是先取值再自增的,编译器会先把i (这时为0)存入寄存器(cpu中的存储器),再加1,然后计算下一个i++ 与前一次一样,所不同的是这次 i 的值是1,因为前面已加1 ,最后++i 。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值