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++ 是第二个可选表达式