微笑向暖~ 发表于 2017-10-28 18:16:08

这个22编译器是怎么给出的,求个详细解释!!!



这个22编译器是怎么给出的,求个详细解释!!!

dt3tc 发表于 2017-10-28 19:23:42

我认为,这是编译器的bug
首先编译下面的代码
#include <stdio.h>

int main()
{
   int j=5,q,a,b,c;
   q=(a=(++j))+(b=(++j))+(c=(++j));
   printf("%d\n%d\n%d\n%d\n",q,a,b,c);
    return 0;
}
结果是q是21
但如果是这样
#include <stdio.h>

int main()
{
   int j=5,q,a,b,c;
   q=(++j)+(b=(++j))+(c=(++j));
   printf("%d\n%d\n%d\n",q,b,c);
   return 0;
}
q就变成了22
在楼主的编译器上大概也是一样的

丶忘却的年少o 发表于 2017-10-28 19:25:51

7+7+8 = 22
看这个帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824

丶忘却的年少o 发表于 2017-10-28 19:26:29

dt3tc 发表于 2017-10-28 19:23
我认为,这是编译器的bug
首先编译下面的代码
#include


这不是BUG,是一个编译器的算法。
详见帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824

dt3tc 发表于 2017-10-28 19:29:44

丶忘却的年少o 发表于 2017-10-28 19:26
这不是BUG,是一个编译器的算法。
详见帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824

多谢指教

丶忘却的年少o 发表于 2017-10-28 19:33:51

dt3tc 发表于 2017-10-28 19:29
多谢指教

不用客气,如果会汇编的话可以看下反汇编,能看出点头绪。{:10_330:}

丶忘却的年少o 发表于 2017-10-28 20:43:30

q=(++j)+(++j)+(++j);
计算机不会和人脑一样能一下子把几个数合起来一起算,它只能两两结合起来算。根据编译器的优化计算是这样的:
首先把后面两项先算,结果再和前面的合起来一起算。q=(++j) + ((++j)+(++j));先来算下这个,我们用一个方程式表示 y = (++j)+(++j),q=(++j) + y。这就变成了两个式子,先来算 y 。
y = 7+7 = 14:因为前置++优先级比较大,而且是显示当前结果,和后置 j++这样的结果不一样,后置的 j++会得出 j 这个答案,而 ++j 会得到 j+1的答案。那么两个 ++j 的结果是 7,所以7+7=14
q = (++j)+ y = 8+14=22:前面已经算出了y = 14,j 因为通过了两次++j已经到7了,这次又来自增一次,就是8了,结果就这样出来了
页: [1]
查看完整版本: 这个22编译器是怎么给出的,求个详细解释!!!