c++ - Visual C++ 2008 错误?

标签 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;
}

调试模式给我正确结果:

1
2
3

但是 Release 模式给我错误的结果:

1
2

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

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

  • 您在使用 Visual C++ 2008 Express 时遇到过相同的错误吗?
  • 此错误是否存在于较新的版本(2010、2012)中?
  • 如何避免这个错误?
  • 有SP可以修复吗?
  • 也许要更改一些编译选项(不是默认选项)?

更新:

当我写作时

cout << a+1 << endl;

cout << 2*a << endl;

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


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

最佳答案

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

当您不强制它使用 2*a < 8 弄清楚 <= 与除法的行为时,该错误就会消失。工作正常。

这个错误已经修复了一段时间,我不知 Prop 体是什么时候,因为这些旧版本的错误报告已经从公共(public)站点上删除了。处理优化器错误的最佳方法是给它们一个修复它们的机会,保持你的编译器更新是非常重要的。您有 3 个较新版本的 Express 版本可供选择,这是编译器开发中的两条命。三个 C++11 左右:)

关于c++ - Visual C++ 2008 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20067283/

相关文章:

c++ - 将 ntohs() 与字符串流一起使用

c++ - 如何编写在函数执行过程中收集垃圾的测试用例?

visual-studio-2008 - Visual Studio SVN 集成

visual-studio-2008 - 当我没有 app.config 文件时编译器告诉我 "Consider app.config remapping"时我应该更改什么?

winforms - 自定义选项卡控件未显示在 Visual Studio 窗体设计 View 中

c++ - 小对象分配器

c++ - 直接列表初始化编译成功,但是正常直接初始化失败,为什么?

c++ - 交换重载算术运算符的参数

database - 如何在 Visual Studio 2008 中连接到 Access 2007 (accdb) 文件

c# - Visual Studio 2008 单元测试入门