**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
4天前关闭。
Improve this question
#include <iostream>
using namespace std;
int add(){
int c;
c++;
if(c==10)return c;
else add();
return c;
}
int main()
{
cout<<add();
return 0;
}
为什么代码没有陷入无限循环而是终止,没有输出?
我只是好奇想知道。我的动机不是增加只是为了学习不同的概念。
3条答案
按热度按时间a2mppw5e1#
为什么代码没有陷入无限循环,而是终止,没有输出?
你在递归方面有问题。大多数实现使用空间有限的堆栈,并且每次调用
add
都会消耗堆栈。最终,它会耗尽堆栈空间,程序将崩溃。你可以修改你的代码,通过不使用无限递归来指示程序陷入无限循环--但接下来会出现下一个问题:
作为旁注:您在此处已经有未定义的行为:
c++
需要从c
进行 read,但c
未初始化,因此UB。这里有一个例子,说明创建一个没有副作用的无限循环可以对语法正确的程序做些什么。在
add()
中,我创建了一个不使用递归的无限循环,因此它不会占用堆栈空间并因此而崩溃。您可能希望这个程序永远挂起而不打印任何东西-但由于它具有未定义的行为,因此可能发生的事情几乎是无限的。
10
所有这些,以及更多,都在可能的范围内,具有 * 未定义的行为 *。在这个demo中,
clang++
和-O3
选择退出程序而不产生任何输出。jv4diomz2#
因为在你的代码中有未定义的行为。在add函数中,变量c在使用之前没有初始化。它被声明为自动变量,这意味着它的初始值是不确定的。因此,递增它(c++)而不初始化它会导致未定义的行为。c的值也在每次递归调用中递增,但它在函数本身中永远不会达到10的值。因此,函数会无限期地调用自身。试试这样;
68bkxrlz3#
您的代码函数add没有传递保留
c
的值以下是将值传递到add
的更正代码