post increment operator java

南楼画角 提交于 2019-11-26 03:22:57

问题


I can\'t make heads or tails of the following code from \"java puzzlers\" by joshua bloch.

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


 }
}

I can\'t get the part where j prints 0. According to the author,

j=j++

is similar to

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

But

a=b++

makes b 1. So it should\'ve evaluated like this,

a=b
b=b+1

By following the same logic, shouldn\'t

j=j++

be evaluated as,

j=j
j=j+1

Where does the temp come into picture here? Any explanations would be much appreciated. << I\'m breaking my head over this. ;)>> Thanks in advance.


回答1:


Let's break down your own argument:

According to the author,

j=j++;

is similar to

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

Yes, you're right so far..., but here's where you got it wrong:

But

a=b++;

makes b=1. So it should've evaluated like this,

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

WRONG! You're not applying the rule consistently! You've changed the order from increment then assign to assign then increment!!! It's actually evaluated like this:

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

Basically assignments of this form:

lhs = rhs++;

is similar to doing something like this:

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

Apply this to a = b++;. Then apply it also to j = j++;. That's why you get the results that you get.

What you did was you came up with your own interpretation of what a = b++; does -- a WRONG interpretation that doesn't follow the above rule. That's the source of your confusion.


See also

  • JLS 15.14.2 Postfix Increment Operator

    "...the value 1 is added to the value of the variable and the sum is stored back into the variable [...] The value of the postfix increment expression is the value of the variable before the new value is stored."




回答2:


The post increment operator implicitly uses a temp variable. This allows it to return one value while setting its argument to another. That's why

a = b++;

Can increment b, but set a to the old value of b. The same thing is going on with

j = j++;

The variable is incremented on the right hand side, but it's then set back to the old value when the assignment takes place.




回答3:


j++ will use the old value of j and then it will increment it. But when it overwrites the left hand side, it will use the old value of j.

It is similar to :

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


来源:https://stackoverflow.com/questions/2750216/post-increment-operator-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!