重複の可能性:
これらの未定義の動作 (i = i++ + ++i、i = i++ など) を説明できる人
はいますか? Java と C++ の演算子に違いはありますか?
c++とJavaで単項演算子が異なる結果をもたらすのはなぜですか?
これをチェックしてください:
int i = 1;
i = i++ + ++i;
print i (with cout or println)
Javaの場合: 4 を出力します
C++の場合: 5 を出力します
なんで ?
重複の可能性:
これらの未定義の動作 (i = i++ + ++i、i = i++ など) を説明できる人
はいますか? Java と C++ の演算子に違いはありますか?
c++とJavaで単項演算子が異なる結果をもたらすのはなぜですか?
これをチェックしてください:
int i = 1;
i = i++ + ++i;
print i (with cout or println)
Javaの場合: 4 を出力します
C++の場合: 5 を出力します
なんで ?
C++ では、 などのステートメントの動作i = i++ + ++i;
は実際には未定義であるため、動作が異なるという事実はそれほど驚くべきことではありません。
実際、 2 つの異なる C++ コンパイラが C++ ステートメントに対して異なる動作を生成しても驚くべきことではありませんi = i++ + ++i;
。
関連する質問:
Java では、++
値が式に評価され、インクリメントが他の演算子の干渉なしで発生するという意味で、修正後のインクリメント演算子はいくぶん「アトミック」(スレッド関連の意味ではない) です。
ウィキペディアの Java の演算子の優先順位表。
i = i++ + ++i
i = ((i++) + (++i))
i = (1 + (++i)) // i = 2
i = (1 + 3) // i = 3
i = 4
C の場合、動作は標準で定義されていません。
ウィキペディアの C の演算子の優先順位。
このコードでよりよく説明されています:
int i = 1;
int j =0;
j = i++ + ++i;
print j (with cout or println)
Java では、i++ と ++i の結果は同じで、i は 1 ずつインクリメントされるので、次のようにします。2 + 3 = 5 i はその後 5 になります。jはその後5になります
c++ では、i++ と ++i の動作が異なります。i++ はその場でインクリメントし、++i は後でインクリメントします。
j は 4 になり、i は 5 になります。
C++ と Java は言語が異なるため、効果が異なります。オペレーターの優先順位を参照してください。
Java ++
(接尾辞と接頭辞) は同じ行にありますが、C++ では優先順位が異なります。
i = i++ + ++i;
つまり、異なるコンパイラまたは異なるコンパイラ設定で異なる結果が得られる可能性があります。
int i = 1;
i = i++ + ++i;
System.out.println(i);
int i = 1;
int j = i++ + ++i;
System.out.println(j);
Java では式 を左から右 (LALR) に解析するため、常に4を指定します。