右から左に割り当てが行われている場合、なぜ以下を実行してもコンパイラエラーが発生しないのですか?
String str = str = "";
右から左に割り当てが行われている場合、なぜ以下を実行してもコンパイラエラーが発生しないのですか?
String str = str = "";
動作は、代入演算子に関するJava言語仕様#15.1によって定義されています。つまり(私の強調):
それ以外の場合は、次の3つの手順が必要です。
- 最初に、左側のオペランドが評価されて変数が生成されます。この評価が突然完了すると、同じ理由で代入式が突然完了します。右側のオペランドは評価されず、割り当ては発生しません。
- それ以外の場合は、右側のオペランドが評価されます。この評価が突然完了すると、同じ理由で割り当て式が突然完了し、割り当ては発生しません。
- それ以外の場合、右側のオペランドの値は左側の変数のタイプに変換され、値セットの変換(§5.1.13)が適切な標準値セット(拡張指数値セットではない)になります。変換の結果は変数に格納されます。
したがって、式の評価はstr = str = "";
右から左ですが、左側のオペランドString str
が最初に評価され、変数が作成されます。
Java言語仕様のパラグラフ6.3によると、独自の初期化子内で(ローカル)変数を使用することが許可されています。
ブロック内のローカル変数宣言のスコープ(§14.4)は、宣言が表示されるブロックの残りの部分であり、独自の初期化子で始まり、ローカル変数宣言ステートメントの右側にさらに宣言子が含まれます。
初期化される前に変数を読み取ることは許可されていませんが、そのステートメントはそれを行いません。
Javaでは、オブジェクトを右から左に割り当てることができます。
次のコードはこれを明確に示しています。
String a;
String b;
String c;
String str = a = b = c = "Hello World!";
2番目のstrのようなものはありません。
String str = str = ""; // There is only 1 str here and it is declared properly.Thus the compiler doesnt give any error.
String str = a = ""; // This will give Error Though since a is undeclared
コンパイラは警告を生成します。Assignment to variable str has no effect
これは、コンパイラが単にそれを次のように置き換えることを意味します。
String str = "";