6.8.5 迭代语句
语法
1、iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration ; expressionopt ; expressionopt ) statement
约束
2、一个迭代语句的控制表达式应该具有标量类型。
3、一条for语句的声明部分应该仅为具有auto和register存储类的对象声明标识符。
语义
4、一条迭代语句引发一条被称为循环体的语句重复执行,直到控制表达式比较结果等于0。无论循环体是否从迭代语句还是通过一条跳转语句进入,重复都会发生。[注:被跳过的代码不被执行。特别地,一条for或while语句的控制表达式在进入循环体之前不被计算,也不是一条for语句的clause-1。]
5、一条迭代语句是一个语句块,其作用域是其封闭语句块作用域的严格子集。循环体也是一个语句块,其作用域是迭代语句迭代语句作用域的一个严格子集。
6、对于其控制表达式不是一个常量表达式的一条迭代语句[注:一个省略的控制表达式用一个非零常量代替,它是一个常量表达式。],如果它不执行输入/输出操作,在其循环体内不访问volatile对象,并且不执行同步或原子操作,控制表达式,或(在for语句的情况下)其expression-3,可以通过对终结符的实现来占位。[注:此目的在于允许编译器翻译诸如对空循环的移除,甚至当终止不能被证明时。]
6.8.5.1 while语句
1、控制表达式的计算在循环体的每次执行之前发生。
6.8.5.2 do语句
1、控制表达式的计算在循环体的每次执行之后发生。
6.8.5.3 for语句
1、语句 for ( clause-1 ; expression-2 ; expression-3 ) statement
行为如下:表达式expression-2是控制表达式,它在循环体的每次执行之前被计算。表达式expression-3作为一个void表达式,在循环体的每次执行之后被计算。如果clause-1是一个声明,那么它所声明的任一标识符的作用域是该声明的剩余部分以及整个循环体,包括其它两个表达式;在控制表达式的第一个计算之前,它以执行次序到达。如果clause-1是一个表达式,那么它在控制表达式的第一次计算之前,作为一个void表达式被计算。
2、clause-1与expression-3都可以被省略。如果省略expression-2,那么它用一个非零常量来代替。[译者注:即控制表达式的条件永远是真。]