注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

随机过程

http://superware.blog.163.com

 
 
 

日志

 
 

垃圾代码  

2015-08-14 16:38:23|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

合语法的代码可能是垃圾代码,比如:

1  c = 1;
2 d = 0;
3 d = ++c + ++c

4 printf ("c = %d\n", c);
5 printf ("d = %d\n", d);


第三条语句是合乎语法的,但是是垃圾代码,编译器对这条代码的编译结果没有定义,也就是说不能保证这条代码得到正确的结果。因此不同的编译器给出的结果是不同的,比如 GCC 给出的结果是:

c = 3

d = 6


而 Clang 在编译是就给出警告:

warning: multiple unsequenced modifications to 'c' [-Wunsequenced]

d = ++c + ++c;

^ ~~

1 warning generated.


表明 ++ 运算符与 + 号或其他运算符号连用是应该警惕的,而执行的结果为:

c = 3

d = 5


上述两个编译器得到的结果都不相同,说明这条语句在编译器标准中没有定义,原因是语义不完备造成的。

实际上,如果严格按照 C 的语义,结果应该是:

d = ++c + ++c

c = 2, 3

d = 2 + 3

所以

c = 3

d = 5

说明 clang 虽然给出警告,但还是遵循了 C 的语义的完整性,而 GCC 虽没有给出警告,但结果是错误的。也表明 GCC 默认用户知道这是一条不合法的语句。但很多教科书,尤其是国内的教科书,却对这样的垃圾语句进行了大量介绍,纯粹是误导
  评论这张
 
阅读(86)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017