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

时间:2013-03-24 05:26:51

标签: c infinite-loop undefined-behavior

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

2 个答案:

答案 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");