我想知道为什么这两个代码会给出不同的结果;
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;
答案 0 :(得分:4)
在第二个示例中,输出在for循环之外。不带花括号的for循环仅包含以下语句。
答案 1 :(得分:4)
for
循环,while
循环和if
语句(忽略else
)都控制一个语句强>:
for (
[ForInit];
[表达式];
[ForUpdate] {{ 1}} 声明
)
{VariableModifier} UnannType VariableDeclaratorIdfor (
表达式:
声明
)
表达式while (
声明
)
表达式if (
声明
该陈述可能是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);
前两个非常糟糕,因为它们隐藏(歪曲)代码结构。
许多人主张总是使用块,以防止混淆和编码错误。
答案 2 :(得分:2)
这是因为你的案例中迭代的默认范围是它后面的唯一一行,相当于 -
for(i=1, j=0;i<10;i++){
j += i;
System.out.println(i);
}
因此整个循环是迭代的,因为在那之后i == 10的值,这是你在第二种情况下的输出。
在第一种情况下,非常明显的是每次迭代都会打印出值,因此1到9(小于10):
{{1}}
答案 3 :(得分:1)
没有大括号的循环仅适用于下一个语句
所以:
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
答案 4 :(得分:1)
第一个语句包含代码块。代码块作为一个单元处理。
要创建代码块,您应该在花括号之间插入语句。
如果没有指定代码块,循环和条件表达式只处理它们下面的第一个语句。
因此:
// 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);