我想知道为什么这两个代码给出不同的结果;
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(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
循环,while
循环和if
语句(忽略else
)都控制一个语句:
for (
[ForInit];
[表达];
[ForUpdate])
声明
for (
{VariableModifier} UnannType VariableDeclaratorId:
Expression)
Statement
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);
for(i=1, j=0;i<10;i++) {
j += i;
}
System.out.println(i);
前两个非常糟糕,因为它们隐藏(歪曲)代码结构。
许多人主张总是使用块,以防止混淆和编码错误。
在第二个示例中,输出位于for循环之外。不带花括号的for循环仅包含以下语句。
不带括号的循环仅适用于下一个语句
所以:
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);