java operator ++问题

时间:2011-08-04 17:15:16

标签: java operators

我想知道为什么第一个代码输出是000而第二个代码是123

第一个:

int z=0;
    while(z<4)
    {
       z=z++;
       System.out.print(z);

    }
第二个:

int z=0;
int x=0;
    while(z<5)
    {
       x=z++;
       System.out.print(x);

    }

这两个代码有什么不同,为什么第一个块不会增加z的值?

9 个答案:

答案 0 :(得分:13)

z=z++是程序员的错误 - 它的作用是增加z然后将z设置为其旧值 - 因此它用旧值覆盖z,从而撤消增量。

答案 1 :(得分:8)

增量运算符已经递增z,您不必将返回值赋回z

z++

是一个帖子增量。它返回z,然后它递增z。 在您的第一个示例中,您基本上只是将0分配给z,并且您的循环不应该结束。

在第二个示例中,您将z的旧值分配给x,然后增加z。这意味着你不会像第一个例子那样再次开始递增0,但是当z达到5(因此z <5为假)时,由于后递增,z为5,x为4。

答案 2 :(得分:3)

使用后增量运算符时,无需将结果赋回变量。

也就是说,您的代码应如下所示:

int z=0;
    while(z<4)
    {
       ++z;
       System.out.print(z);

    }

在Java中,操作在增量之前返回z的值(之后在后面增加变量),然后将该值重新分配给z。这就是为什么它永远不会改变。

预增量运算符将执行增量并返回NEW结果,因此您将得到您期望的结果:

int z=0;
    while(z<4)
    {
       z=++z;
       System.out.print(z);

    }

这将打印1234

答案 3 :(得分:3)

记住这一点,Java评估你的表达式从右到左(就像C和C ++一样),

所以,如果你的代码是

z = z++

然后如果在执行此行之前z为0,则会发生以下情况:

  1. z++被评估为表达式,返回值0
  2. 然后z由于++运算符而递增,并且值为1.
  3. 现在,左侧的z被分配了值z = (value returned by z++)
  4. 由于z++返回的值为0,z将重置为0.
  5. 需要注意的重要一点是z++中固有的赋值结果在左边的z变量更新之前计算

答案 4 :(得分:1)

这是因为您使用后缀运算符分配z的值。

http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

int z = 0;
i = z++; // i equals 0
x = ++z; // x equals 2

后缀运算符将在分配 i 后递增 z 的值。

一元运算符++将在分配 x 之前增加 z 的值。

在z之前将其视为++,在分配之前将其视为+1,将++视为分配后的z为+1。

答案 5 :(得分:1)

我认为这会给你一个很好的解释。

考虑这个课程:

public class T
{
    public void f() {
    int count = 0;
    count = count++;
    }
}

这是相关的字节代码:

public void f();
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1
   6:   istore_1
   7:   return
}
  1. iconst_0将常量0加载到堆栈上(这用于为变量count赋值0
  2. istore_1将堆栈值(现在为0)存储到变量1
  3. iload_1将变量1(现在为0)的int值加载到堆栈中
  4. zinc 1, 11变量1(count = 1现在)增加
  5. istore_1将堆栈值(0现在从步骤#3)存储到变量1
  6. 返回
  7. 现在应该很清楚如何用Java编译count = count++

答案 6 :(得分:0)

第一个可能写得更好

int z=0;
while(z++<4)
{
   System.out.print(z);
}

int z=0;
while(z<4)
{
   z = ++z;
   System.out.print(z);
}

这里的预增量非常重要,因为它会增加然后分配。而不是分配然后增加 - 除了在第一个例子中重置为0之外没有任何效果。

因为当你执行z=z++时,它会将旧值重新分配回z,从而导致无限循环。

第二个将结束,因为你没有重新分配回z:

int z=0;
int x=0;

while(z<5)
{
    x=z++;
    System.out.print(x);
}

这将打印1234。

答案 7 :(得分:0)

如果您正在编写foo = foo++之类的内容,那么您做错了。一般来说,如果你看到任何像x = x++ + ++x;这样的表达,那就严重错了。无法预测如何评估该类型的表达式。在像C这样的语言中,这些表达式可以作为实现者的需求进行评估。

我强烈建议您使用++运算符,因为在阅读代码时您肯定会遇到它。

正如其他人所指出的,x++是后缀运算符,++x是前缀运算符。

int x = 0;
int y = x++; // y=0, x=1
int z = ++x; // z=2, x=2

请注意yzx的值是在评估表达式后的执行期间的内容未定义。

因此,如果你看到像foo(x++, ++x, x)这样的代码,那就跑山了。

你自己的问题写得更简洁:

for (int z=0; z<4; ++z) {
    System.out.print(z);
}

上面的代码的优点是变量z的范围在for循环中,因此它不会意外地与其他变量发生碰撞。

答案 8 :(得分:-1)

z=z++;

这意味着首先将z的值(在正确的位置)分配给z(在左侧位置),然后在右侧z中进行增量(这是没用的)。