post increment operator java

时间:2010-05-01 14:03:08

标签: java post-increment

我无法通过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

这里的温度在哪里? 任何解释都将非常感激。 &LT;&LT;我突然对此不以为然。 ;)&GT;&GT; 提前谢谢。

3 个答案:

答案 0 :(得分: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 Postfix Increment Operator
      

    “...将值1添加到变量的值中,并将总和存储回变量[...]后缀增量表达式的值是变量之前的值< / em>存储新值。“

答案 1 :(得分:12)

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

a = b++;

可以增加b,但将a设置为b旧值

正在进行同样的事情
j = j++;

变量在右侧递增,但在分配发生时将其设置回旧值。

答案 2 :(得分:1)

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

类似于:

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