【问题标题】:Does the "for" loop in C require a "{}" after it?C 中的“for”循环是否需要在其后添加“{}”?
【发布时间】:2014-10-01 09:53:24
【问题描述】:

我的程序中有这段代码:

if (primeiro != atual){                        
                    for (i = 0; i < atual -> numeroChaves; i++) 
                    // comment
}

我收到以下错误:

d8641900: In function 'printaArvore':
d8641900:130:7: error: expected expression before '}' token
       }
       ^     

所以我在代码中做了如下改动:

if (primeiro != atual){                        
                        for (i = 0; i < atual -> numeroChaves; i++){}
                        // comment
    }

它运行得很顺利。

我的疑问是:是我的代码有问题,还是适用于所有情况的规则?

有趣的是,在我的代码的其他部分,我有类似的情况(在 for 循环之后没有“{}”),但在它之后我有一行包含有效命令,并且它运行完美。

【问题讨论】:

  • 它需要一些东西:要么是大括号,要么是一行内容
  • 任何循环或测试都需要 something 在它之后。相同的规则适用。如果没有提供大括号,则仅执行下一行。如果提供了大括号,则执行大括号内的所有内容。
  • @sapi 注意空语句; 有资格作为某事。所以for(i = 0; i &lt; 10; ++i); 是有效的,并且什么都不做。
  • 你想用这段代码完成什么?

标签: c for-loop token grammar


【解决方案1】:

大括号严格不是必需的;您需要的是 for 之后的一个(可能为空)语句。您可以通过仅放置一个分号来结束一个空语句来完成此操作:

// It's a little more readable to put the semicolon on a line by itself
for (i=0; i<atual->numerChaves; i++)
;

或者,就像你做的那样,包括一个由空括号组成的空 compound 语句。

【讨论】:

  • 您需要完全一个(可能为空)声明。
【解决方案2】:

不,大括号不是必需的,但它们是个好主意。

for 语句的语法是:

for ( 表达式opt ; 表达式opt ; 表达式opt ) 语句

(您也可以将第一个“表达式opt;”替换为声明,但这在这里并不重要。)

重要的部分是末尾的语句for 语句只需要一个语句作为它的一部分。

可以是任何类型的语句,包括空语句(由单个分号组成)或,也称为复合语句

复合语句由开头的{ 组成,后跟零个或多个声明和语句,然后是结尾的}

所以你可以写:

for (i = 0; i < 10; i ++)
{
     printf("i = %d\n", i);
}

但大括号是复合语句语法的一部分,不是for 语句的语法。上面也可以写成:

for (i = 0; i < 10; i ++)
     printf("i = %d\n", i);

甚至:

for (i = 0; i < 10; i ++) printf("i = %d\n", i);

就风格而言,我个人更喜欢始终使用复合语句作为for(或if,或while等)的受控语句,因为(a) 更容易保持一致,并且 (b) 更易于维护;如果我想在printf 之前或之后添加第二条语句,则大括号已经存在。

需要注意的一点:如果你不小心写了:

for (i = 0; i < 10; i ++);  /* extra semicolon */
{
     printf("i = %d\n", i);
}

这仍然是完全合法的——但for 只控制由那个杂散分号组成的空语句;它后面的块是独立的,并且将只执行一次而不是 10 次。

【讨论】:

    【解决方案3】:

    C 中的“for”循环后面需要一个语句。

    如果您需要多个语句,则可以用{} 将它们括起来。
    (当然,你也可以包含零个或一个语句。)

    ; 可以代表一个空语句。

    所以下列任何一项都是正确的。

    for (int i=0; i<10; i++);
    for (int i=0; i<10; i++) {}
    for (int i=0; i<10; i++) function_that_do_nothing();
    for (int i=0; i<10; i++) 1;
    for (int i=0; i<10; i++) function_that_do_something();
    for (int i=0; i<10; i++) just_a_statement;
    for (int i=0; i<10; i++) { statements... }
    

    另外,

    for (initialization; condition; statement)
        one_statement;
    

    不能分开,所以下面是相等的。

    for (int i=0; i<10; i++)
        for (int j=0; j<10; j++)
            a_statement;
    
    for (int i=0; i<10; i++) {
        for (int j=0; j<10; j++)
            a_statement;
    }
    
    for (int i=0; i<10; i++) {
        for (int j=0; j<10; j++) {
            a_statement;
        }
    }
    

    ifwhile 也是如此。

    【讨论】:

    • 谢谢!因此,在“for (int i=0; i
    • 1; 是一个与 true;false;0; 类似的语句。此外,i = i; 是一个实际上什么都不做的语句(但如果编译器不放弃此语句,CPU 可能会在此语句上花费很短的时间)。
    • 是的,任何表达式都可以是语句。但是后面没有分号也是一个语句。
    • 在循环的特定情况下,我个人最喜欢的是for (...) continue; 我不喜欢for (..);,因为我发现自己没有注意到裸分号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2011-09-23
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多