java - 順位 - 演算子 オーバーロード 利点




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

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

i += j;

ちょうどショートカットだった:

i = i + j;

しかし、私たちがこれを試してみると、

int i = 5;
long j = 8;

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

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


Java型では、代入演算の右辺の式の型を、代入の左辺の変数の型に安全に昇格できるときに、自動的に変換が実行されます。 したがって、私たちは安全に割り当てることができます:

 byte -> short -> int -> long -> float -> double. 

同じことは、他の方法では動作しません。 たとえば、long型をint型に自動的に変換することはできません。これは、最初の型が2番目の型以上の記憶域を必要とするため、情報が失われる可能性があるからです。 このような変換を強制するには、明示的な変換を実行する必要があります。
タイプ - 変換


i = i + l場合はexplicitlylongからintにキャストする必要があります。コンパイルして正しい出力を与えます。 好きな

i = i + (int)l;

または

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

+=場合は、演算子が正しい変数の型から左の変数の型にキャストを暗黙的に行うため、明示的にキャストする必要がないため、正常に機能します。


ここの微妙な点...

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

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

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

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

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


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

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'

はい、

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

i += l; 

コンパイラはこれを

i = (int)(i + l);

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

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


主な違いは、 a = a + b場合、タイプキャスティングが行われないため、コンパイラは型キャストしないために怒ってしまいます。 しかしa += b場合、実際に何をしているのかは、 bと互換性のある型への型キャストです。 そうすれば

int a=5;
long b=10;
a+=b;
System.out.println(a);

あなたが実際にやっていることは次のとおりです:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

非常に良い質問。 Java言語仕様はあなたの提案を確認します。

たとえば、次のコードは正しいです。

short x = 3;
x += 4.6;

次のものと等価であるため、xの値は7になります。

short x = 3;
x = (short)(x + 4.6);




assignment-operator