无限循环与无限递归。都不确定吗?

for*_*818 7 c++ recursion loops undefined-behavior language-lawyer

没有副作用的无限循环是不确定的行为。有关cppreference的示例,请参见此处。更简单的例子:

int foo() {
    while(true) {}
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

现在考虑几乎相等

int bar() {
    if (true) return bar();
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

这还会调用未定义的行为吗?

或用不同的措辞:根据语言,无限递归属于哪类错误?

PS:请注意,我知道运行时的含义:循环原则上可以永远运行,而递归最终将导致stackoverflow。尽管我主要对编译器对它们的操作感兴趣。也许是一个相当学术性的问题...

Rak*_*111 10

不,没有区别。[basic.progress] p1

该实现可以假定任何线程最终都将执行以下操作之一:

  • 终止,

  • 调用库I / O函数,

  • 通过可变的glvalue进行访问,或

  • 执行同步操作或原子操作。

无限循环的方式无关紧要;如果它没有完成以上任何要点,您将获得UB。包括以下内容:

int bar(int cond) {
    if (cond == 42) bar(cond);
    return 42;
}
bar(some_user_input);
Run Code Online (Sandbox Code Playgroud)

允许编译器假定some_user_input永远不会是42。

  • @ user463035818在C ++抽象机中没有堆栈大小。那是那些实现定义的限制之一,但是如果有意义的话,它不算是程序终止。 (3认同)