Java の +=、-=、*=、/= 複合代入演算子(良い質問です:))を見つけましたが、よくわからない部分がありました。その質問からの借用:
int i = 5; long l = 8;その後
i = i + l;、コンパイルされませんがi += l;、正常にコンパイルされます。
リンクされた質問に対する受け入れられた回答には、次のように記載されています。
E1 op= E2 の形式の複合代入式は、E1 = (T)((E1) op (E2)) と同等です。ここで、T は E1 の型ですが、E1 は 1 回だけ評価されます。
これは、一度だけ評価される例外を除いてi += l;同じです。i = (int)((i) + (l));i
Alongは (IIRC でさえ保証されている) よりも長いint可能性があり、したがって、はるかに広い範囲の値を保持できます。
この状況では、ステートメントの実行中 (右辺値式の評価または代入) のある時点で必要な縮小変換が原因でデータ損失が非常に簡単に発生する可能性があることを考えるとi += l;、コンパイル時エラーまたは少なくとも警告ではないのはなぜですか?