なぜ、Javaの+ =、 - =、* =、= =複合代入演算子はキャスティングを必要としないのですか?



Answers

このキャストの良い例は、* =または/ =を使用しています。

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

または

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

または

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

または

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
Question

今日まで、私は、例えば:

i += j;

ただのショートカットです:

i = i + j;

しかし、もし我々がこれを試してみると、

int i = 5;
long j = 8;

次に、 i = i + j; コンパイルされませんが、 i += j; うまくコンパイルされます。

それは実際にはi += j; このようなもののためのショートカットですi = (type of i) (i + j)




ここの微妙な点...

jがdoubleでiがintの場合、 i+j暗黙の型キャストがあります。 Javaは常に整数をdouble型に変換します。

i+=jを明確にするために、ここでiは整数であり、 jはdoubleである。

i = <int>(<double>i + j)

参照: 暗黙のキャスティングのこの説明

この場合、 j(int)に型キャストして分かりやすくすることができます。




時々、そのような質問はインタビューで尋ねることができます。

たとえば、次のように記述します。

int a = 2;
long b = 3;
a = a + b;

自動タイプキャスティングはありません。 C ++では上記のコードをコンパイルする際にエラーは発生しませんが、JavaではIncompatible type exceptionます。

したがって、これを避けるためには、次のようにコードを記述する必要があります。

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting



はい、

基本的に私たちが書くとき

i += l; 

コンパイラはこれを

i = (int)(i + l);

私はちょうど.classファイルのコードをチェックしました。

知ることは本当に良いことです




ここで問題となるのは型キャストです。

intとlongを追加すると、

  1. intオブジェクトはlongにキャストされ、両方が追加され、longオブジェクトが返されます。
  2. 長いオブジェクトは暗黙的にintにキャストできません。 だから、あなたは明示的にそれをしなければなりません。

しかし+=は、型キャストを行うようにコード化されています。 i=(int)(i+m)






Links