首先结论:(1)void func(int a, int b, int c, int d)中参数按dcba,即从右至左的顺序依次入栈。
(2)printf("%d, %d\n",(a++)*a,a+=2)中从右至左依次计算。
即使(1)(2)情况下,参数都是从右到左的依次被执行。
(3)a++先使用a的值再自增,产生临时变量,++a先自增再使用新的a的值,不产生临时变量。
关于这一点可在下面的程序中详细体现。
#include <iostream>
using namespace std;
void func(int a, int b, int c, int d)
{
printf("%d ", a);
printf("%d ", b);
printf("%d ", c);
printf("%d ", d);
printf("\n");
}
int main()
{
int a, b, c;
a = 2;
b = 2;
c = 2;
printf("%d, %d\n",(a++)*a,a+=2);
func(b++,b,b++,b++);/*a++先使用a的值再自增,产生临时变量*/
func(++c,c,++c,++c);/*++a先自增再使用新的a的值,不产生临时变量*/
}
首先printf中,从右到左依次计算表达式的值,再从左往右依次输出(2)。这里需要注意的是a+=2, 实际上是要输出&a地址上的值,所以即使在第一次计算中这一部分的值为4, 但是在(a++)*a中a的值被增加为5,所以在输出时a+=2这一部分的输出为5。
结果如图
接下来看2个func的输出,func(b++,b,b++,b++),执行后结果为4 5 3 2,这里参见第一条(1)函数的参数从右往左依次入栈,同时注意到第二个参数b是要输出&b上的值,所以在第一个参数b++改变b的值后,第二个参数仍会改变。
但是func(++c,c,++c,++c),执行后4个输出全为5就让我疑惑了好一阵了,最终我找到了第三条解释(3),即关于a++和++a实现原理的不同,a++先使用a的值再自增,产生临时变量,所以在func(b++,b,b++,b++)中每一个b++都会产生一个临时变量,最终printf输出的时临时变量地址上的值,所以3个b++之间并不相互影响,各自会输出入栈时状态的值。 而++a先自增再使用新的a的值,不产生临时变量,所以func(++c,c,++c,++c),中4个参数都是要输出&c地址上的值,他们的变化相互影响,所以最终输出c的值,即结果为4个5.