免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ethantsien
打印 上一主题 下一主题

[C] 一道题 --- 学C就要关注更底层的东西 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2012-10-15 20:12 |只看该作者
回复 17# ethantsien

你还没弄懂抽象与实现之间的关系。


   

论坛徽章:
0
42 [报告]
发表于 2012-10-15 20:16 |只看该作者
回复 23# ethantsien
你把实现BUG当成了语言BUG,所以说你还没弄明白抽象与实现之间的关系。

   

论坛徽章:
0
43 [报告]
发表于 2012-10-15 21:19 |只看该作者
好吧,这BUG只有当编译器把三目优化成条件传送指令cmove之类的时候才会出现

如果是条件转移指令je之类的话,不会出现运行时BUG

回复 33# folklore

cmovne   (%rax), %eax

无论有没有传送成功,这里对%rax的引用还是做了

回复 36# star1983653

你这代码肯定没问题,因为你只用到了条件转移指令

回复 42# supermegaboy

你哪里来的,就回哪里去,不要来抠字眼。我们说平常说的“这段代码有BUG”难道不包括运行时的BUG?


论坛徽章:
0
44 [报告]
发表于 2012-10-15 23:00 |只看该作者
给你个指针,你就敢,取值,不怕崩溃吗?

论坛徽章:
0
45 [报告]
发表于 2012-10-15 23:02 |只看该作者
int *a = (int *)1;
foo(a);

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
46 [报告]
发表于 2012-10-15 23:07 |只看该作者
这个肯定是个编译器错误,不用多想。你写的是C,而不是汇编,遵守C的语义和规则。
C语言对 1?2:3 的要求  2 仅在1求值不为假时求值,这里的条件判断在2的求值之前。
cmovne 1,2 的语义是首先拿1的数据,再判断条件zf==0是不是成立,成立的话就把1取的数据给2,这里的条件判断在1的求值之后
这两个是矛盾的。生成的指令产生这种矛盾,只能是编译器的问题。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
47 [报告]
发表于 2012-10-15 23:10 |只看该作者
gvim 发表于 2012-10-15 23:07
这个肯定是个编译器错误,不用多想。你写的是C,而不是汇编,遵守C的语义和规则。
C语言对 1?2:3 的要求  2 仅在1求值不为假时求值,这里的条件判断在2的求值之前。
cmovne 1,2 的语义是首先拿1的数据,再判断条件zf==0是不是成立,成立的话就把1取的数据给2,这里的条件判断在1的求值之后
这两个是矛盾的。生成的指令产生这种矛盾,只能是编译器的问题。


顶一下大虾:)

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
48 [报告]
发表于 2012-10-15 23:16 |只看该作者
回复 47# Ager

回的好快

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
49 [报告]
发表于 2012-10-15 23:20 |只看该作者
gvim 发表于 2012-10-15 23:16
回复 47# Ager

回的好快


3¼min,还快?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
50 [报告]
发表于 2012-10-15 23:26 |只看该作者
回复 47# Ager

每次人一说编译器,我就想怎么现在做技术的思考的东西都这么深入了?
我个人不是做编译器的,只对编译器做了一些浅显的了解。可是有时候看到这种帖子很矛盾,编译器虽然是个框,但最基本的原则肯定是遵守C标准的而不是从汇编来解释C的陷阱。就如同前几天有人帮乔解释他的&&的问题,一出来就说编译器给你优化掉了,C标准要求的求值顺序感觉就是被优化pass的。
所以我说有时候思考多了不如不思考。

笑而不语  && 哭笑不得
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP