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;)

这样执行:

  1. 将x初始化为1
  2. x 增加 1
  3. 判断是否x < 10。如果是,迭代循环。如果没有,结束循环。

你要的是这个:

for (int x = 1; x < 10; x++)
  1. 将x初始化为1
  2. 判断是否x < 10。如果是,迭代循环。如果没有,结束循环。
  3. x 增加 1

x的增量结合条件。通常,增量是在for循环的第三段执行的,这是在迭代结束时执行的语句。

但是,在循环的[​​=22=]开始 处检查条件。这是一个表达式,而不是语句,但如您所见,这并不能阻止某人插入副作用——x.

的预增量

因为 x1 开始,条件在第一次迭代之前将其递增到 2

++x 递增 x 的值。结果,发生了两件事:

  1. 为循环条件(即不等式)检查的值已经递增,并且
  2. 这个增加的值是在循环中打印的值。

如果您想要从 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);
}