关于c语言和c++中的函数参数的执行顺序的问题

对于c/c++函数参数的读取顺序,参数入栈时顺序的确是从右向左入栈,但是在入栈前会先把参数列表里的表达式从右向左算一遍得到表达式的结果,最后再把这些运算结果统一入栈。也就是说在参数入栈前,编译器会先把参数的表达式都处理掉,哪怕这些运算会改变其中某些参数的值;然后对于一般的操作来说,参数入栈时取值是直接从变量的内存地址里取的,但是对于a++操作,编译器会开辟一个缓冲区来保存当前a的值,然后再对a继续操作,最后参数入栈时的取值是从缓冲区取,而不是直接从a的内存地址里取。因此,对于下面的程序:

a=10;printf("%d %d %d\n",a++,++a,a,a++)

最后的结果是12 13 13 10。具体解析:

首先从右向左处理表达式,最后a的结果变成13.但是在处理a++的时候,从最右边开始,第一个a++放进缓冲区的值为10,第二个a++放进缓冲区的值为12.因此最后处理结果如上。注意++a和a的值都是直接从a的内存中取出来的,都是13.

参考:https://blog.csdn.net/u010141928/article/details/72904193

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/81185153