以下是C标准的摘录(n1256 TC3 C99的第6.8.5节)。
迭代语句:
while ( 表达 ) 声明
执行 声明 ,而 ( 表达 ); <登记/> ( 表达式 opt ; 表达式 opt ; 表达 opt ) 声明
( 声明 表达式 opt ; 表达式 opt < / sub> ) 声明
我最感兴趣的是最后一句话:for ( declaration expression ; expression ) statement
。 6.8.5.1解释了for
循环,但只提到了for ( clause-1 ; expression-2 ; expression-3 ) statement
语法。
我根据这种语法尝试编写代码,但它们都给了我语法错误。例子:
for (int i = 0, i; i++) { /* ... */ }
for (int i = 0; !(i++)) { /* ... */ }
使用GCC(v4.9.2)编译时,所有这些都会导致与error: expected ‘;’ before ‘)’ token
类似的错误。
我不确定我是否以正确的方式解释标准。这种语法可以用一些有用的方式,还是我忽略了什么?
答案 0 :(得分:40)
不幸的是,这不容易阅读。您误读了for
语句的第二种情况。第一个分号是declaration
的组成部分,因此隐藏在你的眼睛里。您可以通过查看附件A轻松检查这些语法问题。您有:
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
答案 1 :(得分:30)
如果你看,语法是,
for ( declaration expression1opt ; expression2opt ) statement
让我们将它与一般陈述进行比较
for (int i = 0; i < 10; i++) printf("%d \t", i);
在这里,
int i = 0;
表示declaration
[包括;
] i < 10
表示expression1opt
[可选] ;
符合;
的语法要求[必须,如语法中所述] i++
是expression2opt
[可选] printf("%d \t", i);
是statement
现在,在你的情况下,
for (int i = 0, i; i++) { /* ... */ }
int i = 0, i;
表示declaration
i++
表示expression1opt
;
缺少 ..... 此处的最后一点产生错误。您需要让;
通过语法检查。