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 &lt;= 7 处摸索,它会为a &lt;= 2 生成代码。这当然是错误的,应该是a &lt;= 3a &lt; 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 时如何解决未处理的异常错误?

解读将 Visual C++ 6 项目升级到 Visual Studio 2008 时出现的错误

Visual C++ 2008 提升问题