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)
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; 表示 declarationi++ 表示 expression1opt;是缺少 .....这里的最后一点产生错误.您需要;通过语法检查.
| 归档时间: |
|
| 查看次数: |
3911 次 |
| 最近记录: |