printf函数输出时参数的计算顺序

参数计算难道是按我们的思维从左至右一个一个算吗?

先引一个例子 以下编译结果均为VS编译器运行

int a=2;

printf("%d %d",a+=2,a);

输出的结果是4 4,这好像是我们从左往右算出一个输出一个,貌似没什么问题

printf("%d %d %d",a+=2,a,a+=2);

输出结果是6 6 6,那这不对了啊,按刚才的思路不应该是4 4 6,那根据这个结果,是不是从左往右先把a通过表达式改变后的值算出来,然后再依次输出。不是算一个输一个,而是全部算完,再输出。

printf("%d %d %d",a=1,a=2,a=3);

输出的结果是1 1 1,不应该是3 3 3?那我们再根据这个结果提出假设:从右往左先把a通过表达式改变后的值算出来,然后再依次输出

我们再举更多的例子来验证我们的假设

int i=1;

printf("%d %d",++i,i); 输出结果是2 2,与我们的假设一致

int b=3,a=5;

printf("%d %d",a+b,++b);输出结果是9 4,与我们的假设一致

这两例里面都有前置自增运算符,那后置自增运算符呢?我们知道前置自增与后置自增的不同在于:前置自增++i表达式的值是i自增后的值;后置自增i++表达式的值是i自增前的值。

把这两例里面的前置自增换成后置自增有何不同

printf("%d %d",i++,i);输出结果是1 2

printf("%d %d",a+b,b++);输出结果是9 3

关键就是i++先用i的值,我们如果还是向假设提到的那样把i通过表达式改变后的值算出来,然后输出,那就不符合后置自增的规则。所以printf函数遇到后置自增是怎么处理呢?

我们举一个更加直观的例子

printf("%d %d %d %d %d %d",i++,i,i++,i,i++,i);输出结果是3 4 2 4 1 4

所以,是不是遇到i++就先把它的值输出,也就是此时i的值。其余部分还是之前的规律。

也就是说我们要把i++当成特例,特殊处理。

归结一下我们得出的规律就是:先对参数从左往右把各个可以改变变量的表达式算一下,得出变量改变后的值,然后再依次输出,当然表达式不包括i++这种后置自增的,遇到后置自增我们就直接把此时变量的值输出就好,后续就不用管它了。

至于为什么要从右至左,涉及到入栈操作了,后续我再出文介绍。

这是上面例子的代码:

 

 

 

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值