为什么这段C++代码没有陷入无限循环,没有任何输出?[关闭]

rqdpfwrv  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(219)

**已关闭。**此问题为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;
}

为什么代码没有陷入无限循环而是终止,没有输出?
我只是好奇想知道。我的动机不是增加只是为了学习不同的概念。

a2mppw5e

a2mppw5e1#

为什么代码没有陷入无限循环,而是终止,没有输出?
你在递归方面有问题。大多数实现使用空间有限的堆栈,并且每次调用add都会消耗堆栈。最终,它会耗尽堆栈空间,程序将崩溃。
你可以修改你的代码,通过不使用无限递归来指示程序陷入无限循环--但接下来会出现下一个问题:

  • 无限循环(没有副作用)有未定义的行为,实现可能只是删除循环,然后你又回到了原点。

作为旁注:您在此处已经有未定义的行为:

int c;
c++;

c++需要从c进行 read,但c未初始化,因此UB。
这里有一个例子,说明创建一个没有副作用的无限循环可以对语法正确的程序做些什么。在add()中,我创建了一个不使用递归的无限循环,因此它不会占用堆栈空间并因此而崩溃。

#include <iostream>

int add(){
    while(true) {} // infinite loop
    return 10;
}

int main() {
    std::cout << add() << '\n';
}

您可能希望这个程序永远挂起而不打印任何东西-但由于它具有未定义的行为,因此可能发生的事情几乎是无限的。

  • 它可能永远挂着
  • 它可以跳过循环并返回10
  • 它可以正常退出程序而不打印任何内容
  • ...

所有这些,以及更多,都在可能的范围内,具有 * 未定义的行为 *。在这个demo中,clang++-O3选择退出程序而不产生任何输出。

jv4diomz

jv4diomz2#

因为在你的代码中有未定义的行为。在add函数中,变量c在使用之前没有初始化。它被声明为自动变量,这意味着它的初始值是不确定的。因此,递增它(c++)而不初始化它会导致未定义的行为。c的值也在每次递归调用中递增,但它在函数本身中永远不会达到10的值。因此,函数会无限期地调用自身。试试这样;

int add(int c) {
c++;
if (c == 10)
    return c;
else
    return add(c);
}

int main() {
    int result = add(0);  // Start with c = 0
    cout << result;
    return 0;
}
68bkxrlz

68bkxrlz3#

您的代码函数add没有传递保留c的值以下是将值传递到add的更正代码

#include <iostream>
using namespace std;
int add(int c){
    c++;
    if(c==10){
        return c;
    }
    else{
        add(c);
    }

    return c;
}

int main()
{
    cout<<add(0);

    return 0;
}

相关问题