post increment operator java

sra*_*nia 13 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


 }
}
Run Code Online (Sandbox Code Playgroud)

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

j=j++
Run Code Online (Sandbox Code Playgroud)

类似于

temp=j;
j=j+1;
j=temp;
Run Code Online (Sandbox Code Playgroud)

a=b++
Run Code Online (Sandbox Code Playgroud)

制作b 1.所以它应该像这样评估,

a=b
b=b+1
Run Code Online (Sandbox Code Playgroud)

遵循相同的逻辑,不应该

j=j++
Run Code Online (Sandbox Code Playgroud)

被评估为,

j=j
j=j+1
Run Code Online (Sandbox Code Playgroud)

这里的温度在哪里?任何解释都将非常感激."我对此深有所怀疑.;)>>提前致谢.

pol*_*nts 29

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

据作者说,

j=j++;
Run Code Online (Sandbox Code Playgroud)

类似于

temp=j;
j=j+1;    // increment
j=temp;   // then assign
Run Code Online (Sandbox Code Playgroud)

是的,到目前为止你是对的...,但这里是你弄错了:

a=b++;
Run Code Online (Sandbox Code Playgroud)

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

a=b;      // assign
b=b+1;    // then increment
Run Code Online (Sandbox Code Playgroud)

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

temp=b;
b=b+1;     // increment
a=temp;    // then assign
Run Code Online (Sandbox Code Playgroud)

基本上这种形式的作业:

lhs = rhs++;
Run Code Online (Sandbox Code Playgroud)

做类似于这样的事情:

temp = rhs;
rhs = rhs+1;  // increment
lhs = temp;   // then assign
Run Code Online (Sandbox Code Playgroud)

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

你所做的是你想出了自己的解释是什么a = b++;呢-不遵循上述规则理解错了.这是你困惑的根源.


也可以看看

  • JLS 15.14.2后缀增量运算符

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

  • 哇,这是一个很好的解释.谢谢很多伙伴. (3认同)

Bil*_*ard 12

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

a = b++;
Run Code Online (Sandbox Code Playgroud)

可以增加b,但设置a旧值b.同样的事情正在继续

j = j++;
Run Code Online (Sandbox Code Playgroud)

变量在右侧递增,但在赋值发生时将其设置回旧值.


fas*_*ava 1

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

它类似于:

temp=j;
j += 1; 
j=temp;     // take the old value of j.
Run Code Online (Sandbox Code Playgroud)