我有以下代码:
公共课测试{ public static void main(String [] args)throws Exception { int x = 0; while(x <3){ x = x ++; System.out.print …
我认为因为在Java ++中有一个比=(赋值)更高的优先级......是吗? 看着 http://www.cs.uwf.edu/~eelsheik/cop2253/resources/op_precedence.html ...
如果你写x = x + 1 ... +的方法相同,那么优先级高于=(赋值)
它正在发生,因为它的帖子增加了。这意味着在计算表达式后变量会递增。
int x = 9; int y = x++;
x现在是10,但是y是9,x之前的值是递增的。
查看更多 后增量的定义 。
检查以下代码,
int x=0; int temp=x++; System.out.println("temp = "+temp); x = temp; System.out.println("x = "+x);
输出将是,
temp = 0 x = 0
post increment 手段 的 递增值并在递增之前返回值 强> 。这就是价值的原因 temp 是 0 。那么如果 temp = i 这是一个循环(第一行代码除外)。就像在问题!!!!
post increment
temp
0
temp = i
这符合您对另一个人的期望。这是前缀和后缀之间的区别。
int x = 0; while (x < 3) x = (++x);
x++ =: (x = x + 1) - 1
所以:
x = x++; => x = ((x = x + 1) - 1) => x = ((x + 1) - 1) => x = x; // Doesn't modify x!
而
++x =: x = x + 1
x = ++x; => x = (x = x + 1) => x = x + 1; // Increments x
当然最终结果与公正相同 x++; 要么 ++x; 在一条线上。
x++;
++x;
该值保持为0,因为值为 x++ 在这种情况下,如果值是无关紧要的 x 增加与否,分配 x=0 被执行。这将覆盖临时递增的值 x (“很短的时间”是1)。
x++
x
x=0
x = x++; (increment is overriden by = )
因为上述陈述x永远不会达到3;
当++在rhs上时,结果在数字递增之前返回。 改为++ x,一切都会好的。 Java会对此进行优化以执行单个操作(将x分配给x)而不是增量。
该 x++ 表达式评估为 x 。该 ++ 部分影响后的值 评测 ,不是之后 声明 。所以 x = x++ 被有效地翻译成
++
x = x++
int y = x; // evaluation x = x + 1; // increment part x = y; // assignment
这是因为价值 x 根本没有增加。
x = x++;
相当于
int temp = x; x++; x = temp;
说明:
我们来看看这个操作的字节代码。考虑一个示例类:
class test { public static void main(String[] args) { int i=0; i=i++; } }
现在运行类反汇编程序,我们得到:
$ javap -c test Compiled from "test.java" class test extends java.lang.Object{ test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_1 7: return }
现在 Java VM 是基于堆栈的,这意味着对于每个操作,数据将被推送到堆栈和堆栈,数据将弹出以执行操作。还有另一种数据结构,通常是用于存储局部变量的数组。局部变量给出id,它们只是数组的索引。
让我们来看看 助记符 在 main() 方法:
main()
iconst_0
istore_1
1
iload_1
iinc 1, 1
因此,价值 x 不会改变导致无限循环。
它已经被其他人很好地解释了。我只是包含相关Java规范部分的链接。
x = x ++是一个表达式。 Java将遵循 评估顺序 。 它将首先评估表达式x ++,其中 将增加x并将结果值设置为x的先前值 。 然后它会 分配表达式结果 到变量x。最后,x返回其先前的值。
没有一个答案在哪里,所以这里是:
当你写作的时候 int x = x++ ,你没有分配 x 要分配新的价值 x 成为的回报价值 x++ 表达。这恰好是原始值 x ,如暗示 Colin Cochrane的回答 。
int x = x++
为了好玩,请测试以下代码:
public class Autoincrement { public static void main(String[] args) { int x = 0; System.out.println(x++); System.out.println(x); } }
结果将是
0 1
表达式的返回值是初始值 x ,这是零。但是后来,当读取它的价值时 x ,我们收到更新的值,即一个。
就我所见,错误发生,由于赋值越过递增的值,增量前的值,即它撤消增量。
具体来说,“x ++”表达式在递增之前具有值“x”而不是“++ x”,其在递增之后具有值“x”。
如果您有兴趣研究字节码,我们将看看有问题的三行:
7: iload_1 8: iinc 1, 1 11: istore_1
7:iload_1#将第二个局部变量的值放在堆栈上 8:iinc 1,1#将第二个局部变量增加1,注意它不会触及堆栈! 9:istore_1#将弹出堆栈顶部并将此元素的值保存到第二个局部变量 (您可以阅读每个JVM指令的效果 这里 )
这就是为什么上面的代码将无限循环,而带有++ x的版本则不会。 ++ x的字节码应该看起来完全不同,据我记得一年多前写的1.3 Java编译器,字节码应该是这样的:
iinc 1,1 iload_1 istore_1
因此,只需交换两个第一行,就会改变语义,使得在增量(即表达式的“值”)之后,堆栈顶部留下的值是增量之后的值。
将x ++看作是一个“返回”X的函数调用 之前 增量(这就是为什么它被称为后增量)。
所以操作顺序是: 1:在递增之前缓存x的值 2:增量x 3:返回缓存值(x在增加之前) 4:返回值分配给x
增量运算符应用于您指定的同一变量。那是在惹麻烦。我确信你可以在运行这个程序时看到你的x变量的值......那应该清楚为什么循环永远不会结束。
然而“ = “运营商优先级低于” ++ ”。
=
所以 x=x++; 应评估如下
x=x++;