java 中没有大括号的 for 循环

for loop without braces in java

我想知道为什么下面这两个代码会给出不同的结果;

for(i = 1, j = 0; i < 10; i++) {
    j += i;
    System.out.println(i);
}

这个给出了包含 1 和排除的 10 之间的数字。

for(i = 1, j = 0; i < 10; i++)
    j += i;
System.out.println(i);

然而这个给出了 10。我无法理解这个逻辑;

for()
do_something;
do_something_else;

在第二个示例中,输出在 for 循环之外。没有大括号的 for 循环只包括下面的语句。

那是因为在你的例子中迭代的默认范围是它后面的唯一一行,相当于 -

for(i=1, j=0;i<10;i++) {
    j += i;
}
System.out.println(i);

因此整个循环被迭代,之后 i==10 的值,即第二种情况下的输出。


在第一种情况下,很明显每次迭代都会打印该值,因此从 1 到 9(小于 10):

for(i=1, j=0;i<10;i++){
    j += i;
    System.out.println(i);
}

没有大括号的循环只适用于下一条语句

所以 :

 for(i=1, j=0;i<10;i++)
    j += i;
System.out.println(i);

等同于:

 for(i=1, j=0;i<10;i++){
        j += i;
 }
    System.out.println(i);

i 定义在循环范围之外,并在最后一个循环之后递增,因此它的值为 10

第一个语句包含 代码块。一个代码块作为一个单元处理。

要创建代码块,您应该在花括号之间插入语句。

如果没有指定代码块,循环和条件表达式只处理它们下面的第一条语句。

因此:

// Both statements handled 10 times
for(i = 1, j = 0; i < 10; i++) {
    j += i;
    System.out.println(i);
}

// Only the first statement handled 10 times, the second one is out of scope of the loop
for(i = 1, j = 0; i < 10; i++)
    j += i;
System.out.println(i);

for loop, the while loop, and the if语句(忽略else)全部控制单个语句:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) Statement

while ( Expression ) Statement

if ( Expression ) Statement

该语句可能是 Block,即带有多个语句的大括号 {}

所以,这段代码都是一样的:

for(i=1, j=0;i<10;i++)
j += i;
System.out.println(i);
for(i=1, j=0;i<10;i++)
    j += i;
    System.out.println(i);
for(i=1, j=0;i<10;i++)
    j += i;
System.out.println(i);
for(i=1, j=0;i<10;i++) {
    j += i;
}
System.out.println(i);

前两个非常糟糕,因为它们隐藏(歪曲)了代码结构。

许多人提倡始终使用块,以防止混淆和编码错误。