4

次の点を考慮してください。

int a = 1;
double b = 0.5;
System.out.println(a += b);    // case x
System.out.println(a = a + b); // case y

すぐにわかるのは、上記がコンパイルさえしないということです - ケース y は「互換性のない型」のために失敗します。ケース x を単独で実行すると、単純に a が返されます。

ここで何が起こっているのですか?省略形の演算子 (+=) は、失敗した代入を「キャッチ」し、デフォルトで単純に lhand 値を返しますか? もしそうなら、チュートリアルで非常に一般的であるように、a += b が a = a + b と同等であると主張するのは本当に正しいですか?

4

2 に答える 2

6

Java 言語仕様のセクション 15.26.2 によると、複合代入演算子は左側のオペランドの型への暗黙的な変換を挿入します。

二項演算の結果は左側の変数の型に変換され、適切な標準値セット (拡張指数値セットではない) への値セット変換 (§5.1.13) を受け、変換の結果は次のようになります。変数に格納されます。

代入a = a + bでは、キャストが同等である必要があります。

a = (int)(a + b);
于 2013-11-07T21:27:43.700 に答える
0

double と int の値があります。

a += b is equivalent to a = (int)(a + b);
a = a + b is equivalent to a = a + b;

後者では、キャストせずに double を int に追加しようとしているため、コンパイルできません。a += b がキャストを行います。

于 2013-11-07T21:26:01.220 に答える