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;
、コンパイル時エラーまたは少なくとも警告ではないのはなぜですか?