http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
提到
for ( declaration expression opt ; expression opt ) statement
6.8.5迭代声明。
这是一个拼写错误还是C11在循环中有两个表达式?
答案 0 :(得分:5)
这完全是关于语法的。 6.8.5给出了两种形式的for循环:
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
第二个版本指的是声明循环迭代器变量的情况,自C99以来是新的。
现在,如果我们看看声明的语法是什么意思,可以在6.7中找到:
declaration:
declaration-specifiers init-declarator-listopt ;
注意最后的分号 - 它需要分号作为语法的一部分。将语法复制/粘贴到for循环的第二个版本中,您就可以得到:
for (declaration-specifiers init-declarator-listopt ; expressionopt ; expressionopt )
答案 1 :(得分:1)
在n1570的后续页面中,我们可以看到:
6.8.5.3 for语句
声明
for ( clause-1 ; expression-2 ; expression-3 ) statement
...
以后,第1条可以是声明或表达式
在6.7Déclarations中,我们可以看到:
语法
声明:
declaration-specifiers init-declarator-listopt;
我的理解是声明部分包含第一个分号。例如,在for(int i=0; i<10; i++)
int i=0;
是声明i<10
是第一个可选表达式i++
是第二个可选表达式