1 #include2 #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 }
2,0
依据编译器不同结果不同!
1 #include2 #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 }
1. 在将参数入栈前,编译器会先把参数的的表达式都处理掉,哪怕这些运算会改变其中某些参数的值,
2.对于a++操作,编译器会开辟一个缓冲区来保存当前a的值,然后再对a操作,取值时是从缓冲区取,而不是直接从a的内存地址里取。
通过查看汇编代码,我们发现在参数入栈时顺序的确是从右向左入栈,但是在入栈前先把参数列表里的表达式算一遍得到表达式的结果,最后再把这些运算结果统一入栈,这就解释了为什么第三个参数a会输出12,因为执行完a, ++a, a++后a = 12。那为什么第一项++a会输出11呢,这就要看C++中的++运算符的实现机制了,通过上面的汇编代码,可以看到:
a:12 13 13 10
b:11 12 12c:12 13 13 13