博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++函数参数读取顺序
阅读量:5333 次
发布时间:2019-06-15

本文共 978 字,大约阅读时间需要 3 分钟。

1 #include 
2 #include
3 using namespace std; 4 void B(int a, int b){ 5 cout << a << " " << b << endl; 6 } 7 void A(){ 8 int i=0; 9 B(++i, i++);10 printf("%d\n", i);11 }12 int main() {13 A();14 }
View Code

2,0

依据编译器不同结果不同!

 

1 #include 
2 #include
3 using namespace std; 4 int main() { 5 int a = 10; 6 printf("a:%d %d %d %d\n", a++, ++a, a, a++); 7 int b = 10; 8 printf("b:%d %d %d\n", b++, ++b, b); 9 int c = 10;10 printf("c:%d %d %d %d\n", c++, ++c, c, ++c);11 }
View Code

 

1. 在将参数入栈前,编译器会先把参数的的表达式都处理掉,哪怕这些运算会改变其中某些参数的值,

2.对于a++操作,编译器会开辟一个缓冲区来保存当前a的值,然后再对a操作,取值时是从缓冲区取,而不是直接从a的内存地址里取。

 

通过查看汇编代码,我们发现在参数入栈时顺序的确是从右向左入栈,但是在入栈前先把参数列表里的表达式算一遍得到表达式的结果,最后再把这些运算结果统一入栈,这就解释了为什么第三个参数a会输出12,因为执行完a, ++a, a++后a = 12。那为什么第一项++a会输出11呢,这就要看C++中的++运算符的实现机制了,通过上面的汇编代码,可以看到:

a:12 13 13 10

b:11 12 12
c:12 13 13 13

 

转载于:https://www.cnblogs.com/guxuanqing/p/5840439.html

你可能感兴趣的文章
Java MD5加密类
查看>>
获取用户地理位置
查看>>
javascript事件流的原理
查看>>
网页中屏蔽鼠标右键
查看>>
Java线程
查看>>
Http协议
查看>>
LeetCode -- Ugly Number
查看>>
jquery中prop()方法和attr()方法的区别
查看>>
在windows上使用symfony创建简易的CMS系统(二)
查看>>
2019年7月23日 组合
查看>>
JS组件系列——图片切换特效:简易抽奖系统
查看>>
并发编程——多线程
查看>>
配置 Ubuntu 服务器
查看>>
安装openldap
查看>>
union all 和 union 的 区别
查看>>
快速输入(简单版)
查看>>
适配的js
查看>>
Win7开启SNMP服务
查看>>
godaddy域名使用DNSPod做DNS解析图文教程
查看>>
hdu 4096 Universal Question Answering System
查看>>