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".
我不想更改代码,因为它是正确的代码(在调试模式下运行良好,所有变量都初始化良好,等等).
更新:
我写的时候
cout << a+1 << endl;
Run Code Online (Sandbox Code Playgroud)
要么
cout << 2*a << endl;
Run Code Online (Sandbox Code Playgroud)
它工作/编译正确(3行输出).
注意: 我尝试使用VC++ 2008 Express在不同的计算机上运行.同样的行为.
我可以在VS2008 SP1上重复一遍.像往常一样,这是一个代码优化器错误.您必须查看反汇编以查看原因.2*a <= 7当它将乘法分解出来时,它就会摸索,它会生成代码a <= 2.那当然是错的,应该是a <= 3或者a < 4.看起来它没有正确处理<=运算符的分区.有点棘手,它必须知道奇数和偶数之间的区别:)
当你没有强迫它弄清楚<=如何用除法行为时,这个错误会消失,使用2*a < 8工作正常.
这个bug已经修复了一段时间,我不确切知道什么时候从这些旧版本的bug报告已经从公共站点删除.处理优化程序错误的最佳方法是让他们有机会修复它们,保持编译器更新非常重要.你有3个较新版本的Express版本可供选择,这两个狗生活在编译器开发中.三个用C++ 11左右:)