我想知道为什么第一个代码输出是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的值?
答案 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,则会发生以下情况:
z++
被评估为表达式,返回值0 z
由于++运算符而递增,并且值为1. z
被分配了值z = (value returned by z++)
z++
返回的值为0,z
将重置为0. 需要注意的重要一点是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
}
iconst_0
将常量0加载到堆栈上(这用于为变量count
赋值0
istore_1
将堆栈值(现在为0
)存储到变量1 iload_1
将变量1(现在为0
)的int值加载到堆栈中zinc 1, 1
以1
变量1(count = 1
现在)增加istore_1
将堆栈值(0
现在从步骤#3)存储到变量1 现在应该很清楚如何用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
请注意y
,z
和x
的值是在评估表达式后的。 执行期间的内容未定义。
因此,如果你看到像foo(x++, ++x, x)
这样的代码,那就跑山了。
你自己的问题写得更简洁:
for (int z=0; z<4; ++z) {
System.out.print(z);
}
上面的代码的优点是变量z
的范围在for
循环中,因此它不会意外地与其他变量发生碰撞。
答案 8 :(得分:-1)
z=z++;
这意味着首先将z的值(在正确的位置)分配给z(在左侧位置),然后在右侧z中进行增量(这是没用的)。