Visual C++ 2008错误?

Ole*_*567 11 c++ visual-studio-2008

非常简单的代码(在MS Visual C++ 2008 Express下):

#include <iostream>
using namespace std;

int main()
{
    for (int a=1; 2*a<=7; a++)
        cout << a << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

调试模式给出了正确的结果:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但是发布模式给了我错误的结果:

1
2
Run Code Online (Sandbox Code Playgroud)

好吧,我理解可能的答案"使用2*a <8"; "为什么不<= 3","a <4".

我不想更改代码,因为它是正确的代码(在调试模式下运行良好,所有变量都初始化良好,等等).

  • 您是否有与Visual C++ 2008 Express相同的错误?
  • 这个小虫是否存在于年轻版本(2010年,2012年)?
  • 如何避免这个bug?
  • 是否有修复它的SP?
  • 也许改变一些编译选项(不是默认选项)?

更新:

我写的时候

cout << a+1 << endl;
Run Code Online (Sandbox Code Playgroud)

要么

cout << 2*a << endl;
Run Code Online (Sandbox Code Playgroud)

它工作/编译正确(3行输出).


注意: 我尝试使用VC++ 2008 Express在不同的计算机上运行.同样的行为.

Han*_*ant 7

我可以在VS2008 SP1上重复一遍.像往常一样,这是一个代码优化器错误.您必须查看反汇编以查看原因.2*a <= 7当它将乘法分解出来时,它就会摸索,它会生成代码a <= 2.那当然是错的,应该是a <= 3或者a < 4.看起来它没有正确处理<=运算符的分区.有点棘手,它必须知道奇数和偶数之间的区别:)

当你没有强迫它弄清楚<=如何用除法行为时,这个错误会消失,使用2*a < 8工作正常.

这个bug已经修复了一段时间,我不确切知道什么时候从这些旧版本的bug报告已经从公共站点删除.处理优化程序错误的最佳方法是让他们有机会修复它们,保持编译器更新非常重要.你有3个较新版本的Express版本可供选择,这两个狗生活在编译器开发中.三个用C++ 11左右:)