后增加运算符java

我不能从joshua bloch的“java puzzlers”中得到以下代码的正面或反面。

public class Test22{ public static void main(String args[]){ int j=0; for(int i=0;i<100;i++){ j=j++; } System.out.println(j); //prints 0 int a=0,b=0; a=b++; System.out.println(a); System.out.println(b); //prints 1 } } 

我不能得到j打印0的部分。根据作者,

 j=j++ 

类似于

 temp=j; j=j+1; j=temp; 

 a=b++ 

使b 1.所以它应该像这样评价,

 a=b b=b+1 

按照相同的逻辑,不应该

 j=j++ 

被评估为,

 j=j j=j+1 

这里的温度来自哪里? 任何解释将不胜感激。 “我打破了这个念头。 ;)>>提前致谢。

让我们来分解你自己的论点:

据作者说,

 j=j++; 

类似于

 temp=j; j=j+1; // increment j=temp; // then assign 

是的,你到目前为止…,但这里是你错了:

 a=b++; 

使b=1 。 所以应该这样评价,

 a=b; // assign b=b+1; // then increment 

错误! 你不是一贯的应用规则! 你已经改变了从增量的顺序, 然后分配然后增加 ! 它实际上是这样评估的:

 temp=b; b=b+1; // increment a=temp; // then assign 

基本上这种forms的任务:

 lhs = rhs++; 

类似于做这样的事情:

 temp = rhs; rhs = rhs+1; // increment lhs = temp; // then assign 

将其应用于a = b++; 。 然后将其应用于j = j++; 。 这就是为什么你得到你得到的结果。

你做什么是你提出了你自己的解释是什么a = b++; 没有 – 一个错误的解释,不遵循上述规则。 这是你混乱的根源。


也可以看看

  • JLS 15.14.2后缀增量运算符

    “…将值1添加到variables的值中,并将总和存储回variables中[…]后缀增量expression式的值是variables新值存储之前的值。

后增量操作符隐式使用临时variables。 这允许它将参数设置为另一个值时返回一个值。 这就是为什么

 a = b++; 

可以递增b ,但是将a设置为b 。 同样的事情正在进行中

 j = j++; 

variables在右侧递增,但当赋值发生时,variables将被设置回旧值。

j++将使用j++的旧值,然后增加它。 但是当它覆盖左边时,它将使用j的旧值。

它类似于:

 temp=j; j += 1; j=temp; // take the old value of j.