C中的(空)无限循环未定义行为?

Meh*_*dad 10 c infinite-loop undefined-behavior

for (;;);C中的未定义行为是无限循环吗?(它适用于C++,但我不知道C.)

Kei*_*son 9

不,for (;;)语句的行为在C中定义明确.

N1570,与2011年ISO C标准基本相同,在第6.8.5节第6段中说:

一个迭代语句,其控制表达式不是常量表达式,不执行输入/输出操作,不访问volatile对象,并且不在其主体中执行同步或原子操作,控制表达式,或(在for 语句的情况下)它的表达式-3可以由实现假设终止.

有两个脚注:

省略的控制表达式由非零常量替换,该常量是常量表达式.

这旨在允许编译器转换,例如即使在无法证明终止时也删除空循环.

第一个脚注清楚地表明,它for (;;)被视为具有恒定的控制表达.

规则的要点是在编译器无法证明循环终止时允许优化.但是如果控制表达式是常量,编译器可以简单地证明循环是否终止,因此不需要额外的权限.

  • 只是为了确保捕获所有这些意味着什么:在 C 中,您可以编写一个程序,其中逻辑完全由信号处理程序实现,并使程序处于无限循环中以等待事件。这听起来不像是一个非常聪明的实现,但我同意语言不应该禁止这样做。在 C++ 中,这会被禁止吗? (2认同)