没有花括号的 'for' 循环是什么意思?

15

如果一个 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小于5,并且一旦i不小于5,它就什么都不做,但是当我测试代码时,我发现它也会打印printf语句。我认为没有花括号的循环只执行第一行代码?还是我漏掉了什么。

1
我知道这个问题可能有重复,但是我找不到它... - jpw
4
当您编译并运行它时会发生什么?如果您在for后面添加一个左花括号,然后在printf后面添加一个右花括号,会发生什么?看起来只需大约30秒的努力就可以回答这个问题,而且比在此处发布等待回答要快得多(也更有教育意义)。该代码中绝对没有任何危险阻止您自己做出一点努力。 - Ken White
1
@jpw 在我提问之前,我已经尝试过搜索,但是我没有找到类似于我所要询问的内容。 - Tenza
2
@KenWhite我实际上已经尝试过这个了,并获得了一个具有计数值为5并进行打印的输出,但我想确认一下这是否总是有效以及它是如何工作的。 - Tenza
1
可能是在C语言中什么情况下可以省略花括号?的重复问题。 - zett42
显示剩余2条评论
4个回答

20

如果没有花括号,则仅将循环定义后的第一条语句视为属于循环体。

请注意,在您的示例中,printf 仅被调用一次。虽然它与上一行的缩进匹配,但这是一个干扰项- C 不关心缩进。对我来说,它表明编写代码的人可能忘记了使用大括号,并且意图让 printf 语句成为循环体的一部分。

我唯一会省略花括号的情况是在编写单行 if 语句时:

if (condition) statement;
do_something_else();

在这里,没有缩进会让人产生疑惑第二行语句是否真的属于 if 的体内。如果您阅读此处代码时不具备相应知识,很可能会感到困惑。通过代码风格的统一,您可以更加自信地理解代码。


1
那么,像@gmarintes所说的那样,所有其他内容都被视为在循环体之外?这是否适用于所有循环和if语句? - Tenza
是的,它通常适用于循环和条件语句。在Google上有很多讨论;这里有一个不错的讨论。 - Air
请注意,一行的 do ... while 循环语句会很别扭,因为它需要在循环体语句和条件语句后都加上分号。 - Air

3
如果for循环没有花括号,它会执行下一条语句。语法本质上是:
for (<initialization>;<condition>;<increment>) <statement>;

“语句”部分可以是任何内容。它可能是一个简单的count ++; 或者是一个“if” / “if-else”语句,甚至可以是另一个没有大括号的for-loop!

因此,在这种情况下,代码类似于:

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

我不确定我理解你所说的“它将执行语句,直到下一个';'”是什么意思?这是否类似于说,如果循环的第一行中有一个条件,它将继续迭代直到完成,然后最终通过其余的行? - Tenza
是的。语法本质上是 for (<initialization>;<condition>;<increment>) <statement>; 其中 <statement> 部分可以是任何内容。它可以是一个简单的 count++;或者是一个 'if'/'if-else' 语句,甚至可以是没有大括号的另一个 for 循环! - gmarintes
好的,谢谢你的帮助,这为我解决了问题! - Tenza
“Statements until the next ';'” 是没有意义的。只能有一个语句。 - user207421

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循环或函数)跟在它后面,因此不需要使用大括号。

-1

这取决于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<10;i++, printf("%d ", i), printf("%d\n", i));

(我执行两次以显示第二次也被执行)。

输出结果:

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

如果有人在我的答案中发现了明显的错误,请指出来!// 谢谢!不需要听起来很好。 - William Martens
多年来,我一直在使用C++,但从未见过这种循环语法风格,它显然是完全有效的。然而,它显然没有回答问题,问题是关于for循环括号外的语句。我相当确定增量操作不应该以这种方式使用,如果你滥用for循环语法,会出现糟糕的结果。 - crobar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接