Visual C++ 2008 错误?
Posted
技术标签:
【中文标题】Visual C++ 2008 错误?【英文标题】:Visual C++ 2008 bug? 【发布时间】:2013-11-19 09:07:02 【问题描述】:非常简单的代码(在 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
我不想更改代码,因为它是正确的代码(在调试模式下运行良好,所有变量都初始化良好,等等)。
您在 Visual C++ 2008 Express 中遇到过同样的错误吗? 较年轻的版本(2010、2012)中是否存在此错误? 如何避免这个错误? 是否有 SP 可以修复它? 也许要更改一些编译选项(不是默认选项)?更新:
当我写作时
cout << a+1 << endl;
或
cout << 2*a << endl;
它工作/编译正确(3 行输出)。
注意: 我尝试在不同的计算机上使用 VC++ 2008 Express。同样的行为。
【问题讨论】:
将输出重定向到一个文件,并确保它实际上是不正确的,而不是在您查看输出时出现的一些显示/缓冲问题。 或者使用调试器单步执行,看看代码实际上正在执行。 此行为未出现在我的 VC 2013 中。在调试和发布模式下。 @Mat 这不是一个简单循环,你需要写这样的代码吗?在 VC 2012 发布之前,存在多个与 for-loop 相关的优化错误。blogs.msdn.com/b/vcblog/archive/2012/08/10/10338661.aspx(搜索“循环”) 经过优化在 2012 和 2013 中正常工作。我说的是 bug,并不是说 MS 会急于修复它。 【参考方案1】:我可以在 VS2008 SP1 上重现。像往常一样,这是一个代码优化器错误。您必须查看拆卸才能了解原因。当它排除乘法时,它会在2*a <= 7
处摸索,它会为a <= 2
生成代码。这当然是错误的,应该是a <= 3
或a < 4
。看起来它没有正确处理
当你不强迫它弄清楚 2*a < 8 可以正常工作。
这个错误已经修复了一段时间,我不知道这些旧版本的错误报告是什么时候从公共网站上删除的。处理优化器错误的最佳方法是给它们一个修复它们的机会,保持编译器更新非常重要。您有 3 个新版本的 Express 版本可供选择,这是编译器开发中的两条狗。三个使用 C++11 :)
【讨论】:
以上是关于Visual C++ 2008 错误?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studios 2008 中 C++ 开发中的链接错误
链接错误2005 Visual Studio 2008 C++
奇怪的 Visual Studio 2008 C++ 编译器错误
使用 Visual C++ 2008 时如何解决未处理的异常错误?