非常简单的代码(在 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 <= 3
或 a < 4
.看起来它没有正确处理 <= 运算符以进行除法。有点棘手,它必须知道奇数和偶数之间的区别:)
当您不强制它使用 2*a < 8
弄清楚 <= 与除法的行为时,该错误就会消失。工作正常。
这个错误已经修复了一段时间,我不知 Prop 体是什么时候,因为这些旧版本的错误报告已经从公共(public)站点上删除了。处理优化器错误的最佳方法是给它们一个修复它们的机会,保持你的编译器更新是非常重要的。您有 3 个较新版本的 Express 版本可供选择,这是编译器开发中的两条命。三个 C++11 左右:)
关于c++ - Visual C++ 2008 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20067283/