13

我无法从 joshua bloch 的“javauzzlers”中得出以下代码的正面或反面。

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

这里的温度在哪里出现?任何解释将不胜感激。<<我为此头疼。;)>> 提前致谢。

4

3 回答 3

29

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

据作者介绍,

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

基本上这种形式的作业:

lhs = rhs++;

类似于做这样的事情:

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

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

你所做的是你对什么做了自己的解释a = b++;——一个不符合上述规则的错误解释。这就是你困惑的根源。


也可以看看

  • JLS 15.14.2 后缀增量运算符

    “...值 1 被添加到变量的值中,并且总和被存储回变量中 [...] 后缀增量表达式的值是存储新值之前的变量值。”

于 2010-05-01T14:08:37.883 回答
12

后自增运算符隐式使用临时变量。这允许它返回一个值,同时将其参数设置为另一个值。这就是为什么

a = b++;

可以递增b,但设置a为 的b值。同样的事情正在发生

j = j++;

变量在右侧递增,但随后在赋值发生时设置回旧值。

于 2010-05-01T14:08:43.390 回答
1

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

它类似于:

temp=j;
j += 1; 
j=temp;     // take the old value of j.
于 2010-05-01T14:06:00.213 回答