肚子饿了233 发表于 2021-1-30 21:43:58

C语言!简单问题求助

#include<stdio.h>
main()
{
        int j=5,q;
        q=(++j)+(++j)+(++j);
        printf("%d",q);
}

为什么不是6+7+8呢?而是结果为22呢?

sunrise085 发表于 2021-1-31 11:26:30

懒得再写了,直接给你看一下之前写的答案吧
不要纠结这个了。这个问题本身其实就有问题。了解++i和i++的一些区别即可,不要深究这个本身就有问题的问题了。
这个其实两个都对。只是编译器不一样而已。
书上的这个结果应该是早些年的VC6.0或者TC编译器运行的结果。
      (i++)+(i++)+(i++)整个表达式的运算都在i自加之前完成,所以得到的结果是5+5+5=15,然后在对i进行三次自加。
      (++j)+(++j)+(++j)整个表达式在j自加完成之后运算,所以j先自加3次,得到8,然后在进行求和,得到8+8+8=24


而现在的大部分编译器不这么认为。
       (i++)+(i++)+(i++),自加和求和都是逐步进行的,多项求和从左向右逐步求和,所以先计算(i++)+(i++),第一个括号内是i++,所以先取值,再自加,然后第二个内是i++,所以也是先取值,再自加,这样得到的是5+6=11,i自加了两次为7,然后在和最后一部分求和11+(i++),依然是先取值再自加,得到的是11+7=18,i自加为8
      (++j)+(++j)+(++j),同样是逐步求和,只不过是先自加再求和,计算(++j)+(++j),先对j进行两次自加得到j=7,然后求和,7+7=14,再计算下一步求和14+(++j),依然是先自加再求和,j自加为8,求和14+8=22

若真要再深究的话,i++有临时变量产生,参与运算的是临时变量,因此这个表达式不能作为左值出现,运行效率低一些;++i是对自身的操作,可以作为左值出现,没有中间临时变量,运行效率高一些。

自己编程尽量不要用一个表达式中连续自加的情况,在不同的编译器下回出现各种问题。一般在一个表达式中一个变量只有一次自加,不易出错,++在前先自加,++在后先用值。
如今新的编程语言中怕出现这个问题,根本没有自加运算符了,例如python中就没有自加运算符

原来帖子的位置



页: [1]
查看完整版本: C语言!简单问题求助