控制循环中的流逻辑

时间:2015-07-22 20:06:10

标签: java for-loop control-flow

以下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

8 个答案:

答案 0 :(得分:3)

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

  1. 为for循环条件检查的值(即不等式)已经递增,
  2. 此递增值是在循环中打印的内容。
  3. 如果您想要1到9之间的值,请使用标准循环:

    for (int x = 1; x < 10; ++x) { ... }
    

    前缀和后缀运算符的效果已经在其他地方进行了详细讨论和解释,例如this post

答案 1 :(得分:2)

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

但是,在循环的开头处检查条件。它是一种表达,而不是一种陈述,但正如你所看到的,这并不能阻止某人插入副作用 - x的预增量。

由于x1开头,因此条件会在第一次迭代之前将其增加到2

答案 2 :(得分:1)

这不是for-loop trickery,它是您在x上使用的前缀和后缀运算符的工作方式。

++x - 递增x然后评估其值

x++ - 评估x的值然后递增它。

所以,这个定义的循环:

for (int x = 1; ++x < 10;)

执行如下:

  1. 将x初始化为1
  2. 将x增加1
  3. 评估x&lt; 10.如果是,则迭代循环。如果不是,请结束循环。
  4. 你想要的是这个:

    for (int x = 1; x < 10; x++)
    
    1. 将x初始化为1
    2. 评估x&lt; 10.如果是,则迭代循环。如果不是,请结束循环。
    3. 将x增加1

答案 3 :(得分:1)

每个for-loop(增强for循环除外)具有以下结构 -

for(initialization; conditionChecking; increment/decrement){

   //body

}

您的for-loop也有此结构,incremetn/decrement部分为空。但要继续for循环,您必须更改x的索引(此处for-loop)。如果完成某些操作,那么您可以将increment/decrement部分留空。如果你像这样写for-loop那么它也没关系 -

for(int x=0; x<10; ){
   //do something
   x++;
}  

您也可以将for-loop的一个/多个部分(甚至是正文)留空,如下所示 -

int x=0;
for(;x<10;x++); //empty body; do nothing; just increment x

答案 4 :(得分:1)

for循环有效,其中一个或多个部分留空。 在您的代码中,增量部分为空。您已使用x完成了索引++x>10的增量。所以它是有效的。与常规for循环没有区别,它只是一种以不同方式表示for循环的方式。

答案 5 :(得分:1)

你可能想到的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打印

您应该了解前/后修复操作符的工作原理。循环中的x++会递增值,但不会立即递增。它在x++ < 10;之后递增 在++x < 10;首先递增然后休息时,一切都会发生。

因此,当x值为9时,9(++)&lt; 10 - &gt; 9少了?是的,现在9 ++发生。然后增加x。但++ x增加1,所以++ 9&lt; 10 - &gt; 10&lt; 10 NO。

答案 6 :(得分:1)

您可以将代码编写为:

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

答案 7 :(得分:0)

TL; DR 全部是++x是预增量运算符。当您使用++x时,x将在任何其他联合操作之前递增。这就是为什么你的代码首先输出2而不是1,并在++x变为10

时停止