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,会发生什么:
-
z++
被计算为表达式,返回值0 - 然后,由于++运算符,
z
递增,并且值为1。 - 现在,左侧的
z
被赋值为z = (value returned by z++)
- 由于
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 }
-
iconst_0
将常量0加载到堆栈上(这是为了赋值变量count
为0
-
istore_1
将堆栈值(现在为0
)存储到变量1中 -
iload_1
将int值从变量1(现在为0
)加载到堆栈中 -
zinc 1, 1
加1
变量1(现在count = 1
) -
istore_1
将堆栈值(现在从步骤#3开始)存储到变量1中 - 返回
现在应该很清楚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
请注意, y
, z
和x
的值仅在计算表达式之后才是它们的值。 它们在执行期间的定义是不确定的。
因此,如果你看到像foo(x++, ++x, x)
,那就跑山。
你自己的问题写得更简洁:
for (int z=0; z<4; ++z) { System.out.print(z); }
上面的代码的优点是变量z
在for
循环中作用域,因此它不会意外地与其他变量发生冲突。
z=z++;
这意味着首先将z的值(在正确的位置)分配给z(在左侧位置),然后在右侧z中进行增量(这是没有用的)。