#include <iostream> #include <stdio.h> using namespace std; void B(int a, int b){ cout << a << " " << b << endl; } void A(){ ; B(++i, i++); printf("%d\n", i); } int main() { A(); }
2,0
依据编译器不同结果不同!
#include <iostream> #include <stdio.h> using namespace std; int main() { ; printf("a:%d %d %d %d\n", a++, ++a, a, a++); ; printf("b:%d %d %d\n", b++, ++b, b); ; printf("c:%d %d %d %d\n", c++, ++c, c, ++c); }
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