C中的for (;;);
未定义行为是无限循环吗? (它is for C++,但我不知道C。)
答案 0 :(得分:9)
不,for (;;)
语句的行为在C中已明确定义。
N1570,与2011版ISO C标准基本相同,在第6.8.5节第6段中说:
一个迭代语句,其控制表达式不是常量 表达式,不执行输入/输出操作,不访问 volatile对象,不执行同步或原子操作 在它的身体,控制表达,或(在为的情况下 声明)其表达式-3 ,可以由实现假设 终止。
有两个脚注:
省略的控制表达式被非零常量替换, 这是一个不变的表达。
这是为了允许编译器转换,例如删除 即使无法证明终止,也会出现空循环。
第一个脚注清楚地表明for (;;)
被视为具有恒定的控制表达。
规则的要点是当编译器无法证明循环终止时允许优化。但是如果控制表达式是常量,则编译器可以通常会证明循环是否终止,因此不需要额外的权限。
答案 1 :(得分:0)
与C ++相关的这个问题的基本原理与C无关。第5.1.2.36节规定了优化的限制,其中之一是:
在程序终止时,写入文件的所有数据应与根据抽象语义执行程序的结果相同。
现在问题变成“根据抽象语义生成了什么数据?”。假设信号中断了循环,程序可以很好地终止。然而,抽象语义在该信号被引发之前不会产生输出。如果有的话,编译器可以优化puts("Hello");
。