【问题标题】:post increment operator java后自增运算符 java
【发布时间】:2011-02-14 13:35:09
【问题描述】:

我无法对 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

这里的温度在哪里出现? 任何解释将不胜感激。 > 提前致谢。

【问题讨论】:

    标签: java post-increment


    【解决方案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
    

    基本上是这种形式的作业:

    lhs = rhs++;
    

    类似于做这样的事情:

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

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

    您所做的是您对a = b++; 所做的事情提出了自己的解释 - 一个不符合上述规则的错误解释。这就是你困惑的根源。


    另见

    【讨论】:

    • 哇,这是一个很好的解释。非常感谢队友。
    【解决方案2】:

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

    a = b++;
    

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

    j = j++;
    

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

    【讨论】:

    • 我对这个解释有不同的看法。感谢您的时间伙伴。
    • 很好的解释。不幸的是,在 C/C++ 中表现不同。
    【解决方案3】:

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

    类似于:

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

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2011-01-23
      • 2019-12-23
      • 2020-08-15
      • 1970-01-01
      相关资源
      最近更新 更多