Pik*_*er2 2 c++ recursion return undefined-behavior
我做了一个递归的C++程序,看起来像这样:
using namespace std;
#include <iostream>
bool recursive(int num)
{
if (num == 6)
{
return false;
}
else if (num > 6)
{
return true;
}
else
{
if (recursive(num + 1))
{
return true;
}
else
{
return false;
}
}
}
int main()
{
if (recursive(0))
{
cout << "Not found!" << endl;
}
else
{
cout << "Found..." << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
它起作用,我认为这是(大致)最好的方法.
我的朋友制作了一个更简单的递归程序,如下所示:
using namespace std;
#include <iostream>
bool recursive(int num)
{
if (num == 6)
{
return false;
}
else if (num > 6)
{
return true;
}
else
{
recursive(num + 1);
}
}
int main()
{
if (recursive(0))
{
cout << "Not found!" << endl;
}
else
{
cout << "Found..." << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
他的作品和我一样,但我不明白为什么会这样.对我来说,看起来在他的else块中没有返回任何内容,所以我不明白布尔值如何返回到原始函数调用.
出于好奇,我在JavaScript中制作了一个类似的程序:
function recursive(index)
{
if (index == 6)
{
return true;
}
else if (index > 6)
{
return false;
}
else
{
recursive(index + 1);
}
}
if (recursive(0))
{
console.log("found");
}
else
{
console.log("not found");
}
Run Code Online (Sandbox Code Playgroud)
但JavaScript程序不起作用,这让我觉得这是特定于C++的.
为什么我朋友的计划有效?它完全有效,还是未定义的行为?
它为什么有效?答:没有.
else
{
recursive(num + 1);
}
Run Code Online (Sandbox Code Playgroud)
你朋友的节目缺少一个return声明.
else
{
return recursive(num + 1);
}
Run Code Online (Sandbox Code Playgroud)
不从非void函数返回值会导致未定义的行为.
在这种情况下,碰巧在您测试的计算机上,递归调用的返回值被自动"返回"给调用者 - 可能是因为它碰巧在正确的寄存器中.这是纯粹的偶然事件.你不能依赖它.在不同的机器上,或不同的编译器,甚至是不同的调用,程序也可以返回别的东西,或崩溃,或做任何你能想象的事情.