C++ 为什么在“中生成可执行文件”;“释放”;模式会产生坏结果吗? #包括 int maxComDiv(int MAYER,int menor) { int resto=市长%menor; 如果(resto>0)maxComDiv(menor,resto); 否则返回menor; } int main() { std::cout

C++ 为什么在“中生成可执行文件”;“释放”;模式会产生坏结果吗? #包括 int maxComDiv(int MAYER,int menor) { int resto=市长%menor; 如果(resto>0)maxComDiv(menor,resto); 否则返回menor; } int main() { std::cout,c++,visual-studio,C++,Visual Studio,程序的行为未定义,因为未在所有控制路径上定义macComDiv的返回值 我想你是想写如果(resto>0)返回maxComDiv(menor,resto); (C++中没有隐式返回值)。 这就解释了调试版本和发布版本之间的差异。由于未在所有控制路径上定义macComDiv的返回值,因此程序的行为未定义 我想你是想写如果(resto>0)返回maxComDiv(menor,resto); (C++中没有隐式返回值)。 这就解释了调试版本和发布版本之间的差异。您应该阅读警告消息,否则您将得到: #i

程序的行为未定义,因为未在所有控制路径上定义
macComDiv
返回值

我想你是想写
如果(resto>0)返回maxComDiv(menor,resto);

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


这就解释了调试版本和发布版本之间的差异。

由于未在所有控制路径上定义
macComDiv
返回值,因此程序的行为未定义

我想你是想写
如果(resto>0)返回maxComDiv(menor,resto);

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


这就解释了调试版本和发布版本之间的差异。

您应该阅读警告消息,否则您将得到:

#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;
}
这表示缺少返回语句:

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

这会导致未定义的行为

您应该阅读警告消息,否则您将得到:

#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;
}
这表示缺少返回语句:

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

<>这导致了未定义的行为

问题是,当你启用发布模式时,C++编译器试图优化你的代码,使它运行得尽可能快。 此外,它无法理解
if(resto>0)
将调用一个递归方法,并最终返回false


<>因为它发现在你的方法中不是所有的代码路径返回一个值(<代码>(Resto > 0)< /C>不返回一个值),它给了你错误。< /P> < P>问题是,当你启用发布模式时,C++编译器试图优化你的代码,使它运行得尽可能快。 此外,它无法理解
if(resto>0)
将调用一个递归方法,并最终返回false


因为它看到并不是方法中的所有代码路径都返回值(
if(resto>0)
不返回值)如果条件
resto>0
为真,函数返回什么?@JimmyB bad results似乎表明程序给出了一个结果,这意味着编译成功,那么我的问题是:编译成功后,不同的警告级别会导致不同的输出代码吗?“It失败”不是一个可接受的问题描述。请告诉我们“失败”是什么意思"。在每种情况下,可执行文件的输出是什么?如果我的表达不正确,我表示歉意。我的英语说得不好。当我说可执行文件失败时,意味着没有产生正确的结果。在这种情况下,正确的结果是21。vs2015发布模式:结果是随机的。如果条件
resto>0
为真,那么会发生什么什么是函数返回?@JimmyB bad results似乎表明程序给出了一个结果,这意味着编译成功,然后我的问题来了:编译成功后,不同的警告级别会导致不同的输出代码吗?“它失败”不是一个可接受的问题描述。告诉我们“失败”是什么意思。在每种情况下,可执行文件的输出是什么?如果我的表达不正确,我表示歉意。我的英语说得不好。当我说可执行文件失败时,意味着不能产生正确的结果。在这种情况下,正确的结果是21。vs2015发布模式:结果是随机的。我要补充:当程序运行时,首先要检查的是什么调试中正常但发布中不正常是
未定义的行为
我想补充:当程序在调试中正常运行但发布中不正常时,首先要检查的是
未定义的行为
“最终将返回false”?!因为它将在方法调用中继续使用剩余部分,所以最终
if(resto>0)
将返回false,因为resto将为0。好的,您的意思是比较将产生
false
,而不是递归方法。“最终将返回false”?!因为它将在方法调用中继续使用余数,所以最终
if(resto>0)
将返回false,因为resto将为0。好的,您的意思是比较将产生
false
,而不是递归方法。