无界递归是不定行为吗?
在 C 11 中,没有副作用的无限循环被视为未定义行为 (UB),示例如下以下代码:
<code class="cpp">int main() { while (true) {} }</code>
此行为由 C 标准规定,该标准规定实现可以假设任何线程最终都会终止、执行 I/O 操作、访问/修改易失性对象或执行同步或原子操作。
问题来了:这个定义是否也适用于无界递归,如以下代码所示:
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
根据 C 标准,两者的行为程序是未定义的,因为它们都不执行非 UB 标准定义中指定的任何操作。
但是,需要注意的是,即使 C 标准没有考虑无界递归 UB,它仍然可以如果递归超出了嵌套递归函数调用数量的实现限制,则表现出未定义的行为。情况一直如此,并且无论循环在 C 标准下的 UB 状态如何,它仍然是正确的。
以上是## C 11 中的无界递归是否属于未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!