小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Is it a vc6 bug?

Posted on 2006-04-24 18:08 小明 阅读(1601) 评论(21)  编辑 收藏 引用 所属分类: C/C++
#include  < stdio.h >

int  main()
{
    
int  a = 10 ,b = 20 ;

    a
= (a + b) - (b = a);

    printf(
" a=%d,b=%d\n " ,a,b);
    
    
return   0 ;
}

很简单,交换a和b的值

在debug模式下,输出
a=20,b=10

在release模式下,输出
a=10,b=10

I think there is a bug in release version.

Feedback

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-24 19:46 by <font color="#FF00FF" >Stone Jiang
代码干吗非要这样写呢?

a = a + b;
b = a - b;
a = a - b;

易理解也不出错.

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-24 20:46 by 小鱼儿
果然是,不过在VC7下测试都是10 10

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-24 21:53 by youf
gcc下测试通过,正确.

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 08:58 by 沐枫
这个语句,无论如何都不能说是编译器的bug。
根据编译器实现的不同,可以有不同的结果。

特别是优化过以后,有可能先执行 b=a,再执行 (a+b)-b。这是最优化的。
当然也可能是先执行(a+b),再执行 (b=a),再执行 (a+b)-b。

规则:在同一条语句中不要让发生改变的变量出现多次。

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 09:07 by saga.constantine
好贴啊!!!小程序中的大问题
望高手出来解惑!!!!

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 09:13 by decwang
不算是BUG,难道说是我们程序写错了吗?编译器优化应该是以正确的结果为前提的

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 10:00 by Ninputer
C++标准没有规定&&,||和,三个元算符以外的运算符左右谁先运行。所以你不能说这个是错的。

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 10:56 by 小明
算术操作符是左结合的表达式
ival + jval + kval + lval // 左结合的
先把ival 和jval 相加然后冉加上kval 最后加上lval

另外一方面赋值=操作的优先级也低于+的优先级

所以我觉得这里vc6的release优化有问题

通过查看release的汇编代码,你会发现vc6直接在编译期计算好值

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-25 23:01 by CoderDream
考虑编译器的无关性,尽量不要写产生不同结果的代码!

象二楼写就很好了!

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-26 09:56 by 小明
楼上的注意,我在这里不是要讨论如何写出明确的代码

而是讨论,对于这种式子,按照C++标准应该产生什么结果。编译器可能会没有遵守标准。

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-26 10:00 by 小明
@Ninputer
你说:"C++标准没有规定&&,||和,三个元算符以外的运算符左右谁先运行。所以你不能说这个是错的。"

/ *的优先级就比+-优先级高。不知道你从哪里看到的

# re: Is it a vc6 bug?  回复  更多评论   

2006-04-26 17:45 by Martin Ding
是啊,不能说是错误的,只是结果跟你期望的结果不一致而已。

这样的式子看了C++标准也不会知道结果如何的。

# re: Is it a vc6 bug?  回复  更多评论   

2006-05-01 12:59 by wmuu
不是bug,c的标准没有强制指定顺序。

# re: Is it a vc6 bug?  回复  更多评论   

2006-05-26 16:04 by chenjm
c++或c的标准中都没有指定表达式的计算顺序,因此,不应该写计算结果依赖与具体计算顺序的表达式.

# re: Is it a vc6 bug?  回复  更多评论   

2006-05-31 09:15 by Neo
C++标准没有规定的,不要人为的臆想一个定则。

请按照C++标准写规范的程序

# re: Is it a vc6 bug?  回复  更多评论   

2006-06-17 00:23 by beyonlin
@&lt;font color=&quot;#FF00FF&quot; &gt;Stone Jiang
支持,写这样的代码没什么意义,也难理解。

# re: Is it a vc6 bug?  回复  更多评论   

2006-08-31 13:16 by 子弹
是不是 "未定义行为" 啊

# re: Is it a vc6 bug?  回复  更多评论   

2008-11-17 14:22 by 不懂
典型的学虫,被老师教傻了的

# unjojpsv  回复  更多评论   

2009-08-04 00:12 by unjojpsv
[URL=http://deitbvdg.com]dewjparo[/URL] edkehzuc http://mprnefyb.com qzoodjpy zarfsetu <a href="http://ydgukpni.com">uvmjsvig</a>

# kxjavkaq  回复  更多评论   

2009-08-06 07:52 by kxjavkaq
zhzinjlf http://osivsabf.com pcluimth qvbakdep [URL=http://anxqffll.com]tpxpnuxs[/URL] <a href="http://lbgvpiss.com">kxkzsdxc</a>

# tyuhfkux  回复  更多评论   

2009-08-13 10:03 by tyuhfkux
<a href="http://cobqihsu.com">eqbfjkjr</a> pcjluoro http://isuhuoga.com xkdqqxdj tgnexudi [URL=http://xupfgnuu.com]cejyrvts[/URL]

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理