このコード セグメントでは、
[1]int i=0;
[2]i = i++;
[3]System.out.println(i);
2 行目では、最初に式が実行され (i に 0 が割り当てられます)、次に値が 1 ずつインクリメントされます。
ではSystem.out.println(i)
、答えが 1 ではなく 0 になっています。誰かがこの理由を説明できますか?
このコード セグメントでは、
[1]int i=0;
[2]i = i++;
[3]System.out.println(i);
2 行目では、最初に式が実行され (i に 0 が割り当てられます)、次に値が 1 ずつインクリメントされます。
ではSystem.out.println(i)
、答えが 1 ではなく 0 になっています。誰かがこの理由を説明できますか?
i++ は変数ではなく値を生成します。
i++ は 0 を返します。
次に、i が 1 にインクリメントされます。
次に、0 が i に割り当てられます。
要約: 演算子の優先順位は、期待したものではない可能性があります。または、少なくとも i の実際のインクリメントがどこで発生しているのかを誤解している可能性があります。i++ の使用を 2 行に分割し、その後の行でインクリメントを行っていることを人々に示すのは普通のことですが、これは常に正しいとは限りません。代入演算子の前に発生します。
@chathura2020 : このリンクに移動します。シーケンス ポイントについてです。
シーケンス ポイントは、同じ変数が 1 つの式内で複数回変更された場合にも作用します。よく引用される例は C 式 i=i++ です。これは明らかに i に以前の値を割り当て、i をインクリメントします。i の最終値はあいまいです。これは、式の評価の順序に応じて、インクリメントが代入の前、後、または交互に発生する可能性があるためです。特定の言語の定義は、可能な動作の 1 つを指定するか、単に動作が未定義であると言う場合があります。C および C++ では、このような式を評価すると、未定義の動作が発生します。
(これはJavaには当てはまりません)