鱼C论坛

 找回密码
 立即注册
查看: 2490|回复: 6

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

[复制链接]
发表于 2017-10-28 18:16:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ截图20171028181437.png

这个22编译器是怎么给出的,求个详细解释!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
在楼主的编译器上大概也是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 19:25:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 19:33:51 | 显示全部楼层

不用客气,如果会汇编的话可以看下反汇编,能看出点头绪。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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了,结果就这样出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-30 23:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表