次のコードはなぜですか
int i = 1;
System.out.print(i += i++);
System.out.print(i);
2回目の印刷で3回ではなく2回出力しますか?
誰かがそれに光を当ててくれませんか?
ありがとう。
次のコードはなぜですか
int i = 1;
System.out.print(i += i++);
System.out.print(i);
2回目の印刷で3回ではなく2回出力しますか?
誰かがそれに光を当ててくれませんか?
ありがとう。
a ++が次のように機能することに気付いた場合(擬似コード):
func ++(ref a)
{
int b=a;
a=a+1;
return b;
}
その後、それはすべて理にかなっています。
最終的には3歳になるはずです。
ただし、ステートメントを詳しく調べると
i += (i++)
に等しい
i = ( i + (i++) )
この場合、1+1です。
ご想像のとおり、i++の副作用はi= i + 1 = 1 + 1 = 2ですが、割り当て後にiの値が上書きされます。
Javaバイトコードの構文はまだよくわかりませんが、バイトコードレベルでの私によると、コードは次のようになります。
int i = 1; // iconst_1: variables { }, stack {1}
// istore_1: variables {1}, stack { }
i += i++; // iload_1: variables {1}, stack {1}
// iinc 1, 1: variables {2}, stack {1}
// iadd: variables {2}, stack {2} ...Note that here 1 gets added to the value on stack
// istore_1: variables {2}, stack {2} ...Here the variable value will overwrite the stack value
これはあなたがかなりうまく得ている出力を説明していると思います。:-)
専門家、私が間違っている場合は私を訂正してください...
これは、接尾辞の単項演算子( expr ++)がどのように機能するかがわからないという問題ではないと思います。混乱を引き起こしているのは、ステートメントが評価される順序です。
int i = 1;
System.out.println(i += i++); // Output: 2
したがって、最後のステートメントは、次の2つのステートメントとこの順序で同じです。
i++; // i is now 2 for the rest of this statement and the program
i = 1 + 1; // i is assigned again
したがって、接尾辞演算子が最初に評価されますが、次に行全体が評価されますが、iの前の値が使用されます。
したがって、これをより明確にする別の例を使用するには、次のようにします。
int i = 2;
System.out.println(i += i++); // Output: 4
System.out.println(i); // Output: 4
そして別の例:
int i = 2;
System.out.println(i = i + i++ + i--); // Output: 7
System.out.println(i); // Output: 7
2行目はiを割り当てています。最初のiは2、次のiも2ですが、i ++がiの値を変更したため、3番目のiは3になります。以前の場合と同様に、i--はi = 2 + 2 + 3で書き換えられるため、iに影響を与えることはありません。
int i = 1;
System.out.println(i = i++ + i); // Output: 3
System.out.println(i); // Output: 3
1 + 1 == 2.
したがって:
i + i == 2
と
i += i == 2
その後
i += i++ == 2
かなり簡単です。