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);
前两个非常糟糕,因为它们隐藏(歪曲)了代码结构。
许多人提倡始终使用块,以防止混淆和编码错误。
我想知道为什么下面这两个代码会给出不同的结果;
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);
前两个非常糟糕,因为它们隐藏(歪曲)了代码结构。
许多人提倡始终使用块,以防止混淆和编码错误。