替代for循环语法

bze*_*man 34 c for-loop language-lawyer

下面是C标准的片段(n1256 TC3 C99的第6.8.5节).

iteration-statement:
    while ( 表达式 ) 语句
    do 语句 while ( 表达式 ) ;
    对于 ( 表达选择 ; 表达选择 ; 表达选择 ) 声明
     ( 声明 表达选择 ; 表达选择 ) 语句

引起我兴趣的是最后的陈述: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++)) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

所有这些都导致与error: expected ‘;’ before ‘)’ token使用GCC(v4.9.2)编译时类似的错误.

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

Jen*_*edt 40

不幸的是,这不容易阅读.你误读了该for陈述的第二个案例.第一个分号是declaration你眼睛不可分割的一部分,因此隐藏在你的眼睛里.您可以通过查看附件A轻松检查这些语法问题.您有:

(6.7) declaration: 
    declaration-specifiers init-declarator-listopt ;
    static_assert-declaration
Run Code Online (Sandbox Code Playgroud)

  • 哇,没有适当的背景,这是令人困惑的. (5认同)
  • @BennoZeeman,根据我的经验,很遗憾不是大多数人使用的'for`-loop声明.不同之处在于变量的范围,如果将其限制为`for`循环,通常代码更清晰,您不必观察是否要污染未来使用旧值的迭代变量.这会降低您作为未来读者和编译器的代码复杂性. (5认同)

Sou*_*osh 30

如果你看,语法是,

 for ( declaration expression1opt ; expression2opt ) statement
Run Code Online (Sandbox Code Playgroud)

让我们将它与一般性陈述进行比较

 for (int i = 0; i < 10; i++) printf("%d \t", i);
Run Code Online (Sandbox Code Playgroud)

这里,

  • int i = 0;表示declaration[包括;]
  • i < 10表示expression1opt[可选]
  • ;符合;[必须,如语法中所述] 的语法要求
  • i++expression2opt[可选]
  • printf("%d \t", i); 是个 statement

现在,在你的情况下,

for (int i = 0, i; i++) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
  • int i = 0, i; 表示 declaration
  • i++ 表示 expression1opt
  • ;缺少 .....

这里的最后一点产生错误.您需要;通过语法检查.

  • 我想这是因为这个答案没有解释任何事情.它基本上说"语法无效;尝试别的东西",而OP想知道*为什么*它无效. (10认同)
  • 当你说在某些代码中某些东西是可选的,并且代码本身包含语法错误时,我不明白你说的是什么.另外,"终止"对表达式意味着什么? (3认同)
  • @anatolyg我认为这就是原因.然而,我期待他/她自己的评论.感谢您抽出宝贵时间让我理解错误.也许我应该选择一套更好的词汇.:-) (2认同)
  • 现在很清楚了! (2认同)