java运算符++问题

我想知道为什么第一个代码输出是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的值?

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

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

 z++ 

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

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

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

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

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

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

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

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

这将打印1234

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

所以,如果您的代码读取

 z = z++ 

那么如果在执行这一行之前z为0,会发生什么:

  1. z++被计算为表达式,返回值0
  2. 然后,由于++运算符, z递增,并且值为1。
  3. 现在,左侧的z被赋值为z = (value returned by z++)
  4. 由于z++返回的z++ 0,因此z重置为0。

需要注意的重要一点是,在更新左侧的z变量之前 ,会评估z++固有的赋值结果。

这是因为您使用后缀运算符分配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为+1,在赋值之后为+之后的+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加载到堆栈上(这是为了赋值变量count0
  2. istore_1将堆栈值(现在为0 )存储到变量1中
  3. iload_1将int值从变量1(现在为0 )加载到堆栈中
  4. zinc 1, 11变量1(现在count = 1
  5. istore_1将堆栈值(现在从步骤#3开始)存储到变量1中
  6. 返回

现在应该很清楚count = count++如何用Java编译。

第一个可能写得更好

 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。

如果你正在编写像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); } 

上面的代码的优点是变量zfor循环中作用域,因此它不会意外地与其他变量发生冲突。

 z=z++; 

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