没有副作用的递归是未定义行为吗?
在 C 11 中,没有副作用的无限循环(如下所示)被视为未定义行为 (UB):
<code class="cpp">int main() { while (true) {} }</code>
由于 ISO C 11 标准 (1.10p24) 中的一项规定,该行为是 UB,该规定规定:
The implementation may assume that any thread will eventually do one of the following: - terminate, - make a call to a library I/O function, - access or modify a volatile object, or - perform a synchronization operation or an atomic operation.
此规定适用于循环示例和以下递归程序:
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
在这个递归程序中,没有副作用,但它也被认为是 UB,因为它违反了任何线程最终都会执行列出的操作之一的假设在 1.10p24 中。
请注意,即使不存在此规定,如果递归超出了嵌套递归函数调用的实现定义限制,则递归仍然可能表现出未定义的行为。无论版本如何,C 中始终如此。
以上是## 无副作用的递归是 C 中的未定义行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!