0

据我所知,for 循环的范围,后面没有一组括号,只是一个语句。对?那么这段代码是怎么来的:

    for(int x = 0; x < 3; x++)
        if(x < 2) 
            System.out.println("hello");
            System.out.println("world");

给出输出:

hello
hello
world

中的语句if是否也被视为 for 循环的一部分?当然是,我的问题是为什么?实际上,范围是 for 语句之后的一个块,因为上面的代码在修改时是这样的:

    for(int x = 0; x < 3; x++)
        if(x < 2) { 
            System.out.println("hello");
            System.out.println("world");
        }

给出输出:

hello
world
hello
world

编辑:下面的大多数答案都是关于解释上述代码中的流控制,我已经知道了。我的问题是关于 for 循环范围的规则。

规则是否实际上是:无括号循环的范围是紧随其后for的下一个语句块?

4

6 回答 6

3
First x=0
 Then if (x < 2) condition satisfies (again no braces, so only one statement executes)
   Prints "hello"
for loop continues
x=1
 Then if (x < 2) condition satisfies (again no braces, so only one statement executes)
   Prints "hello"
  for loop continues
x=2
 Then if (x < 2) condition NOT satisfies, so if statement won' execute, moves to print "world"
   Prints "world"

第一个片段将被视为:

for(int x = 0; x < 3; x++){
        if(x < 2) {
            System.out.println("hello");
        }
}
            System.out.println("world");
于 2012-08-17T04:08:24.487 回答
3

如果认为有害,您应该阅读Braceless。这篇文章是专门因为这样的例子而写的;无大括号的控制流语句可能会让您摸不着头脑,尤其是带有误导性缩进的混淆(例如在您的示例中)。

您粘贴的代码相当于以下内容,

for (int x = 0; x < 3; x++) {
  if (x < 2) {
    System.out.println("hello");
  }
}
/* outside of the for */
System.out.println("world");

如您所见,循环迭代了 3 次;前两个,它将打印"hello". 循环完成后,它将打印"world".


阅读Java 语言规范的第 14 章可以清楚地看到这样做的原因。事实上,根据§14.5将视为语句是有意义的。

for (int x = 0; x < 3; x++)
   if (x < 2) 
      System.out.println("hello");
      System.out.println("world");

查看if(§14.9)basic for (§14.14.1)的描述,我们看到两者都只是一个陈述;在这种情况下,我们可以看到我们的for语句包含if语句,它本身封装了您的println("hello")语句。在for声明之后,你就有了你的println("world")声明。

for (int x = 0; x < 3; x++)
    if (x < 2) { 
      System.out.println("hello");
      System.out.println("world");
    }

Here, we see the for statement body is the if statement, which encapsulates a block that contains 2 statements, namely both your println statements. Note that this is indeed not the same as the former.

Hopefully this clears things up for you.

于 2012-08-17T04:12:53.203 回答
1

循环后的一行,条件被考虑在循环体中,条件你没有使用{}所以唯一if的考虑在 for 体中

   for(int x = 0; x < 3; x++)
        if(x < 2) 
            System.out.println("hello");
            System.out.println("world");

给出输出hello hello world,因为

当循环结束world打印时,在 for 循环中考虑 if 语句之后的唯一 1 行

就像是

for(int x = 0; x < 3; x++)
      {  if(x < 2) 
            System.out.println("hello");
       }
     System.out.println("world");

并且在

 for(int x = 0; x < 3; x++)
        if(x < 2) { 
            System.out.println("hello");
            System.out.println("world");
        }

两者都 System.out.println("hello"); System.out.println("world");在 for 循环中考虑

于 2012-08-17T04:08:32.847 回答
0

看到这样...

for控制包含在 . 中的下一条语句if或下一个块{...}

如果{}缺少,则仅将下一条语句视为正文。

在第一种情况下,我已经更正了缩进,以便身体部位清晰可见。

for(int x = 0; x < 3; x++)  
    if(x < 2)   
        System.out.println("hello");
System.out.println("world"); 
于 2012-08-17T04:08:44.643 回答
0

如果您不只{}在循环或条件语句之后放置下一行,则将其视为其范围的一部分。

于 2012-08-17T04:09:53.283 回答
0

它在做正确的事。它为 i = 0 和 1 打印“hello”,然后 for 循环结束并打印“world”。

我认为您对对齐感到困惑,以下是第一个的外观 -

for(int x = 0; x < 3; x++) {
    if(x < 2) {
        System.out.println("hello");
    }
}
System.out.println("world");

而第二个——

for(int x = 0; x < 3; x++) {
    if(x < 2) { 
        System.out.println("hello");
        System.out.println("world");
    }
}

更具可读性和易于理解的逻辑。

于 2012-08-17T04:10:00.113 回答