这个22编译器是怎么给出的,求个详细解释!!!
这个22编译器是怎么给出的,求个详细解释!!!
我认为,这是编译器的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
在楼主的编译器上大概也是一样的 7+7+8 = 22
看这个帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824 dt3tc 发表于 2017-10-28 19:23
我认为,这是编译器的bug
首先编译下面的代码
#include
这不是BUG,是一个编译器的算法。
详见帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824 丶忘却的年少o 发表于 2017-10-28 19:26
这不是BUG,是一个编译器的算法。
详见帖子:http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824
多谢指教 dt3tc 发表于 2017-10-28 19:29
多谢指教
不用客气,如果会汇编的话可以看下反汇编,能看出点头绪。{:10_330:} 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]