为什么这种递归在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代码>。