替代for循环语法

时间:2014-12-10 10:21:07

标签: c for-loop language-lawyer

以下是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类似的错误。

我不确定我是否以正确的方式解释标准。这种语法可以用一些有用的方式,还是我忽略了什么?

2 个答案:

答案 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
  • ; 缺少 .....

此处的最后一点产生错误。您需要让;通过语法检查。