C 中的两部分 for 循环
Two-part for loop in C
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
提到
for ( declaration expression opt ; expression opt ) statement
在 6.8.5 迭代语句下。
这是拼写错误还是 C11 有两个括号中的表达式 for 循环?
这都是关于语法的。 6.8.5给出了for循环的两种形式:
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
第二个版本指的是声明循环迭代器变量的情况,自 C99 以来新增。
现在,如果我们看一下 declaration 的语法含义,可以在 6.7 中找到:
declaration:
declaration-specifiers init-declarator-listopt ;
注意末尾的分号 - 它需要分号作为语法的一部分。 Copy/paste 语法进入 for 循环的第二个版本,你会得到这个:
for (declaration-specifiers init-declarator-listopt ; expressionopt ; expressionopt )
在n1570的后续页面中,我们可以看到:
6.8.5.3 The for statement
The statement
for ( clause-1 ; expression-2 ; expression-3 ) statement
...
以后第 1 条可以是声明或表达式
而在6.7声明中,我们可以看到:
Syntax
declaration:
declaration-specifiers init-declarator-listopt ;
我的理解是声明部分包括第一个分号。例如在 for(int i=0; i<10; i++)
int i=0;
是声明
i<10
是第一个可选表达式
i++
是第二个可选表达式
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
提到
for ( declaration expression opt ; expression opt ) statement
在 6.8.5 迭代语句下。
这是拼写错误还是 C11 有两个括号中的表达式 for 循环?
这都是关于语法的。 6.8.5给出了for循环的两种形式:
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
第二个版本指的是声明循环迭代器变量的情况,自 C99 以来新增。
现在,如果我们看一下 declaration 的语法含义,可以在 6.7 中找到:
declaration:
declaration-specifiers init-declarator-listopt ;
注意末尾的分号 - 它需要分号作为语法的一部分。 Copy/paste 语法进入 for 循环的第二个版本,你会得到这个:
for (declaration-specifiers init-declarator-listopt ; expressionopt ; expressionopt )
在n1570的后续页面中,我们可以看到:
6.8.5.3 The for statement
The statement
for ( clause-1 ; expression-2 ; expression-3 ) statement
...
以后第 1 条可以是声明或表达式
而在6.7声明中,我们可以看到:
Syntax
declaration:
declaration-specifiers init-declarator-listopt ;
我的理解是声明部分包括第一个分号。例如在 for(int i=0; i<10; i++)
int i=0;
是声明i<10
是第一个可选表达式i++
是第二个可选表达式