关于printf(“%d,%d“,i++,++i)的结果的问题

关于下面这行代码在codeblocks下运行的结果,我们先来预想一下。

#include<stdio.h>

int main()
{
    int i = 3;
    printf("%d,%d",i++,++i);
    return 0;
}

i = 3,i++时先输出i的值等于3,再加1等于4;++i先加1等于5,再输出i的值等于5。那么输出的结果应该是3,5

我们是这样想的。

但是实际结果却是这样的:

这就和编译器有关。

printf函数的计算规则是从右往左,然后打印规则是从左往右。

实际上在从右往左计算时,每一次对i的计算都会有一个缓存值。

编译时,首先从右往左将i的值计算出来,然后打印时,

++/--前置的返回i本身的值;++/--后置的返回缓存区的值。

对于上面这段代码来说,++i首先计算i = i + 1 = 4,将4存入缓存区;

然后i++首先将4存入缓存区,在计算i = i + 1 = 5,最后得到i的值为5。

根据上面的规则,++i返回本身的值5,i++返回缓存区的值4

最后从左往右打印,得到结果4,5。

这样就解释了为什么得到的结果与我们想象的结果不同了。

以后在写代码时尽量避免这样无确定意义的表达式出现。

 

新人初次写稿,有错误的地方还请大佬们指正。

以后要多看,多写,多思考。很有精神!!!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值