C/C++函数参数读取顺序

时间:2023-03-09 06:48:07
C/C++函数参数读取顺序
 #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