for循环中的控制流逻辑
Control flow logic in for loop
下面的 for 循环与原来的有什么不同?
为什么在初始化之后,它会检查条件?
为什么会出现这种行为?for
循环的其他此类棘手行为是什么?
class FooBar
{
static public void main(String... args)
{
for (int x = 1; ++x < 10;)
{
System.out.println(x); // it starts printing from 2
}
}
}
输出:
2
3
4
5
6
7
8
9
这不是 for 循环技巧,这是您在 x
上使用的前缀和后缀运算符的工作方式。
++x
- 递增 x 然后计算其值
x++
- 计算 x 的值然后增加它。
因此,具有以下定义的循环:
for (int x = 1; ++x < 10;)
这样执行:
- 将x初始化为1
- x 增加 1
- 判断是否x < 10。如果是,迭代循环。如果没有,结束循环。
你要的是这个:
for (int x = 1; x < 10; x++)
- 将x初始化为1
- 判断是否x < 10。如果是,迭代循环。如果没有,结束循环。
- x 增加 1
x
的增量结合条件。通常,增量是在for
循环的第三段执行的,这是在迭代结束时执行的语句。
但是,在循环的[=22=]开始 处检查条件。这是一个表达式,而不是语句,但如您所见,这并不能阻止某人插入副作用——x
.
因为 x
以 1
开始,条件在第一次迭代之前将其递增到 2
。
++x
递增 x
的值。结果,发生了两件事:
- 为循环条件(即不等式)检查的值已经递增,并且
- 这个增加的值是在循环中打印的值。
如果您想要从 1 到 9 的值,请使用标准循环:
for (int x = 1; x < 10; ++x) { ... }
前缀和后缀运算符的影响已在别处详细讨论和解释,例如 this post。
每个 for-loop
(增强的 for 循环除外)具有以下结构 -
for(initialization; conditionChecking; increment/decrement){
//body
}
您的 for-loop
也有此结构,其中 incremetn/decrement
部分为空。但是要继续 for 循环,您必须更改 for-loop
的索引(此处为 x
)。如果它是如何完成的,那么你可以将 increment/decrement
部分留空。如果你这样写 for-loop
那么它也很好 -
for(int x=0; x<10; ){
//do something
x++;
}
您也可以将 for-loop
的 one/more 部分(甚至正文)留空,就像这样 -
int x=0;
for(;x<10;x++); //empty body; do nothing; just increment x
一个 for 循环是有效的,其中一个或多个部分留空。
在您的代码中,增量部分为空。您已经使用 ++x>10
完成了索引 x
的增量。所以它是有效的。和普通的for循环没有什么区别,只是for循环的一种表示方式不同而已。
TL;DR 的全部原因在于 ++x
是预增量运算符。当您使用 ++x
时,x 将在任何其他联合操作之前递增。这就是为什么您的代码首先打印出 2 而不是 1 并在 ++x
变为 10
你可能想到的for循环的原始方式:
for(initialization; condition; inc/dec/divide..)
还有你提到的:for (initialization; Inc & check; nothing)
这是什么意思? : for(some blaBla; any Bla; some, more, bla)
你可以在任何地方有任何表情。原始版本只是我们遵循的约定。继续写打印语句或按位运算符而不是 some blaBla
试试吧!
更新:
为什么:
for (int x = 1; x++ < 10;)
{
System.out.println(x);
}
打印 2..10?对于答案首先尝试执行:
for (int x = 1; ++x < 10;)
{
System.out.println(x);
}
它从 2..9 开始打印
您应该了解 pre/post 修复运算符的工作原理。 x++
在循环中递增值但不是立即递增。它在 x++ < 10;
之后递增
当 ++x < 10;
首先递增然后休息时,一切都会发生。
那么,当x值为9时,9(++)< 10 -> 9就少了?是的,现在 9++ occurs.It 然后递增 x。但是 ++x 递增 1st 所以 ++9< 10 -> 10<10 NO.
您可以将代码编写为:
x = 1;
while (++x < 10)
{
System.out.println(x);
}
您期望以下内容:
x = 1;
do
{
System.out.println(x);
}
while (++x < 10);
这就是区别。
以下内容符合您的预期:
for (int x = 1; x < 10; x++)
{
System.out.println(x);
}