【发布时间】:2011-04-19 09:10:47
【问题描述】:
我有以下代码:
public class Tests {
public static void main(String[] args) throws Exception {
int x = 0;
while(x<3) {
x = x++;
System.out.println(x);
}
}
}
我们知道他应该只写x++ 或x=x+1,但是在x = x++ 上它应该首先将x 赋予它自己,然后再增加它。为什么x 继续以0 作为值?
--更新
这是字节码:
public class Tests extends java.lang.Object{
public Tests();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_3
4: if_icmpge 22
7: iload_1
8: iinc 1, 1
11: istore_1
12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
15: iload_1
16: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
19: goto 2
22: return
}
我会阅读instructions 以尝试理解...
【问题讨论】:
-
我怀疑发生了什么: 1. 将 x 加载到寄存器中(=0); 2. 增加 x (x=1); 3. 将寄存器值存入 x (x=0)。在 C/C++ 中,这将是未定义的行为,因为没有正式的序列点来定义 2 和 3 的顺序。希望有人可以引用 Java 规范中的等效内容。
-
我们在 C++ 中尝试过这个,看看会发生什么,它会打印 1,2,3 并退出。我原本没想到。我认为它依赖于编译器,因为它是未定义的行为。我们使用了 gnu g++。
-
@saj
x++是后增量;x=是 result 的赋值;x++的 result 是原始的x(并且有增量的副作用,但这不会改变结果),所以这可以解释为var tmp = x; x++; x = tmp; -
现在我有一个很受欢迎的问题,我很遗憾,即使选择了正确的答案,(重复的)答案也不会停止出现。我的“近期活动”屏幕上充满了相同的答案,而且还会有更多...
-
@Rob Vermeulen 您可能想在发表评论之前阅读完整的问题.. ;) 这是我的一个学生编写的代码,我很好奇为什么会出现这种行为。
标签: java loops operators variable-assignment increment