为什么这种递归在C++;? < >我做了一个递归的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; } } 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; } } 但是JavaScript程序不起作用,这使我认为这是针对C++的。

为什么这种递归在C++;? < >我做了一个递归的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; } } 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; } } 但是JavaScript程序不起作用,这使我认为这是针对C++的。,c++,recursion,return,undefined-behavior,C++,Recursion,Return,Undefined Behavior,我朋友的计划为什么有效?它是完全有效的,还是未定义的行为?这是未定义的行为。因为函数被声明为返回布尔值,所以它总是返回一些东西,但不一定是正确的值 如果您使用-Wall标志进行编译,像GCC这样的编译器将针对此类代码向您发出警告。它为什么工作?回答:没有 else { recursive(num + 1); } 您朋友的程序缺少return语句 else { return recursive(num + 1); } 不从非void函数返回值会导致未定义的行为 在这种情况下,在

我朋友的计划为什么有效?它是完全有效的,还是未定义的行为?

这是未定义的行为。因为函数被声明为返回布尔值,所以它总是返回一些东西,但不一定是正确的值


如果您使用
-Wall
标志进行编译,像GCC这样的编译器将针对此类代码向您发出警告。

它为什么工作?回答:没有

else
{
    recursive(num + 1);
}
您朋友的程序缺少
return
语句

else
{
    return recursive(num + 1);
}
不从非
void
函数返回值会导致未定义的行为


在这种情况下,在您测试的计算机上,递归调用的返回值会自动“返回”给调用方——可能是因为它恰好位于正确的寄存器中。这纯粹是偶然。你不能依赖它。在C++中,在不同的机器上,或者不同的编译器,甚至不同的调用,程序也可以返回其他的东西,或者崩溃,或者做任何你可以想象到的事情。我能做的最好的事情就是推测发生了什么,我最好的猜测是调用
recursive(index+1)
,这是函数返回之前堆栈上的最后一件事,正在被提取为返回值。因此,在某种意义上(非标准、不可移植、不适合一般使用),代码隐式地插入了return语句。

当然,它可以工作!嗯,不是真的

else
{
    return recursive(num + 1);
}
地球上的每个编译器(可能不是)都会警告您:

叮当声:
控件可能到达非无效函数的末尾

gcc:
控件到达非无效函数的末尾

MVSC:
并非所有控制路径都返回值

它确实有效,因为你的朋友足够幸运,没有让这个程序爆炸、内爆或在你的卧室里造成黑洞。未定义的行为就是它:您无法判断您的程序将如何运行

这是标准对其的表述:

从构造函数、析构函数或具有cv void返回类型的函数的结尾流出,相当于没有操作数的返回。否则,从函数末尾流出,而非main(3.6.1) 导致未定义的行为


你朋友的密码坏了。未定义的行为。原始代码有25行。这似乎过分得可笑;事实上,由于堆栈溢出量过大,无法显示完整的代码,阅读器被迫在代码框中向下滚动。您可以将相同的功能轻松地放在七行中。您甚至可以在保持可读性的同时将逻辑减少到一行:
returnnum<6?递归(num+1):num>6。但在实际应用程序中,您应该放弃递归:
returnnum>6