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

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


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值