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");
远。