为什么在“发布”模式下生成的可执行文件会产生错误的结果?

时间:2016-04-15 12:48:22

标签: c++ visual-studio

#include <iostream>


int maxComDiv(int mayor, int menor)
{
    int resto = mayor % menor;
    if (resto > 0) maxComDiv(menor, resto);
    else return menor;
}

int main()
{
    std::cout << "max comon divisor: " << maxComDiv(3654, 1365) << std::endl;
}

使用visual studio 2015社区更新2 - &gt;在发布模式下失败。那么在调试模式下。 使用mingw64 - &gt;两种模式都很好。

3 个答案:

答案 0 :(得分:2)

程序的行为是 undefined ,因为return的{​​{1}}值不是在所有控制路径上定义。

我认为你打算写macComDiv

(在C ++中没有隐式返回值)。

这说明了调试和发布版本之间的差异。

答案 1 :(得分:1)

你应该阅读警告信息,你会得到的是gcc:

prog.cc: In function 'int maxComDiv(int, int)':
prog.cc:11:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

表示缺少return语句:

if (resto > 0) 
    return maxComDiv(menor, resto);
    ^^^^^^ ~~~~~~~~ !!

这会导致未定义的行为

答案 2 :(得分:0)

问题在于,当您启用发布模式时,C ++编译器会尝试优化您的代码,以使其尽可能快地运行。

此外,它无法理解if(resto>0)将调用递归方法,最终将返回false。

由于它发现方法中并非所有代码路径都返回一个值(if(resto>0)没有返回值),因此它会给您错误。