13

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

ここで一時はどこに現れますか?どんな説明でも大歓迎です。<< 私はこれについて頭を悩ませています。;)>> よろしくお願いします。

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++;ということです-- 上記の規則に従わない間違った解釈です。それがあなたの混乱の元です。


こちらもご覧ください

于 2010-05-01T14:08:37.883 に答える
12

ポスト インクリメント オペレータは暗黙的に一時変数を使用します。これにより、引数を別の値に設定しながら、ある値を返すことができます。それが理由です

a = b++;

をインクリメントできますが、 の古い値b設定されます。同じことが起こっていますab

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 に答える