C语言中参数执行顺序及a++与++a实现的区别

来源:互联网 发布:淘宝网房产司法拍卖 编辑:程序博客网 时间:2024/06/05 01:57

首先结论:(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.


0 0
原创粉丝点击