【问题标题】:What does a for loop without curly braces do?没有花括号的 for 循环有什么作用?
【发布时间】:2014-12-05 00:58:12
【问题描述】:

嗨,所以基本上我的问题是没有任何花括号的 for 循环是做什么的?所以据我所知,在 if 语句中,只执行第一行代码。那么在 for 循环中它是如何工作的呢?我真的不明白没有大括号和有大括号的循环的概念。我想用一段代码来解释会有所帮助。顺便说一句,这是在 C 中。这是我一直在查看的代码作为参考。

int main(int argc, char* argv[])
{
  int i;
  int count = 0;
  for (i = 0; i < 5; i++)
    count++;
    printf("The value of count is: %d\n", count);

  return 0;
}

在这种情况下,我看到没有花括号,所以我假设它只会继续迭代第一个语句直到 i

【问题讨论】:

  • 我知道有这个副本,只是找不到...
  • 编译运行它会发生什么?如果在for 之后添加一个左花括号,在printf 之后添加一个右花括号,会发生什么情况?似乎大约 30 秒的努力可以为您解答这个问题,而且这比在此处发布并等待答案要快得多(也更有教育意义)。该代码中绝对没有任何危险可以阻止您自己做出一些努力。
  • @jpw 在我问这个问题之前我已经尝试过搜索,但我找不到任何像我想问的东西
  • @KenWhite 实际上我已经尝试过了,得到了一个 count 值为 5 的输出并打印出来,但我想确认这是否总是适用以及它是如何工作的

标签: c for-loop


【解决方案1】:

我想补充一点,我遇到了一些滥用它来执行嵌套 for 循环的代码。

for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
for(int k=0; k<10; k++)
  doSomething(i, j, k);

在这种情况下,每个 for 循环后面只有一个语句(以下 for 循环或函数),因此不需要大括号。

【讨论】:

    【解决方案2】:

    这取决于 for 循环,例如这个执行一些“不带花括号”的东西,打印 (2 次) i (从 1 到 10)

    #include <stdio.h>
    
    int
     main(){
        for(int i=0; i<10;i++,printf("%d ",i),printf("%d\n",i));
     return 0;
    }
    

    对于唯一的循环:

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

    (我做了 2 次以表明 ²nd 也被执行了)

    虽然回答有点晚;希望对以后的人有所帮助。

    输出:

    1 1
    2 2
    3 3
    4 4
    5 5
    6 6
    7 7
    8 8
    9 9
    10 10
    

    【讨论】:

    • 如果有人在我的回答中发现了一个彻头彻尾的疯狂错误部分,请指出! //谢谢!它不需要听起来不错。
    【解决方案3】:

    如果for循环没有大括号,它将执行下一条语句。 语法本质上是

    for (<initialization>;<condition>;<increment>) <statement>;
    

    “声明”部分可以是任何东西。它可以是一个简单的计数++;或者它可能是一个 'if'/'if-else' 语句,它甚至可能是另一个没有大括号的 for 循环!

    所以在这种情况下,代码类似于:

    for (i = 0; i < 5; i++) {
        count++;
    }
    printf("The value of count is: %d\n", count);
    

    【讨论】:

    • 我不确定我理解你的意思是什么意思它会执行语句直到下一个';'?那么这是否类似于说如果循环的第一行中有一个条件,它将继续迭代它直到它完成,然后最终遍历其余的行?
    • 是的。语法本质上是 for (;;) ; 部分可以是任何东西。如果可以是一个简单的计数++;或者它可能是一个 'if'/'if-else' 语句,它甚至可能是另一个没有大括号的 for 循环!
    • 好的,谢谢你的帮助,为我解决了问题!
    • “直到下一个 ';' 的陈述”是没有意义的。只能有一种说法。
    【解决方案4】:

    没有花括号,只有循环定义后面的第一条语句被认为属于循环体。

    请注意,在您的示例中,printf 仅被调用一次。尽管它的缩进与前一行匹配,但这是一条红鲱鱼 - C 不在乎。它告诉我的是,编写代码的人可能忘记了大括号,并且打算printf 语句作为循环体的一部分。

    唯一一次我会省略花括号是在编写一行if 语句时:

    if (condition) statement;
    do_something_else();
    

    这里没有缩进来说明第二行的语句是否实际上应该属于if 的主体。阅读本文后,您可能会更加确信它正在按预期工作。

    【讨论】:

    • 所以像@gmarintes 所说的那样,其他一切都将被视为身体之外的东西?这也适用于所有循环和 if 语句吗?
    • 是的,它通常适用于循环和条件语句。 Google上有很多讨论; here's 一个不错的。
    • 请注意,单行 do ... while 很尴尬,因为它需要在正文语句和条件后面加分号。
    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 2013-09-15
    • 2019-03-09
    • 2020-12-02
    • 1970-01-01
    • 2017-10-28
    • 2012-12-09
    • 2014-09-09
    相关资源
    最近更新 更多