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

for (;;);的无限循环for (;;); C中的未定义行为? (这是针对C ++的 ,但我不知道C.)

不, for (;;)语句的行为在C中定义得很好。

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

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

有两个脚注:

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

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

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

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

与C ++相关的这个问题的基本原理与C无关。第5.1.2.36节规定了优化的限制,其中之一是:

在程序终止时,写入文件的所有数据应与根据抽象语义执行程序的结果相同。

现在问题变成“根据抽象语义生成什么数据会产生什么?”。 假设信号中断了循环,程序可以很好地终止。 然而,抽象语义在该信号被引发之前不会产生输出。 如果有的话,编译器可以优化puts("Hello"); 远。