次の例を検討してください。
class Quirky {
public static void main(String[] args) {
int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false
x = 1; // reset
System.out.println((x = y) == x); // true
}
}
Java言語仕様に、右側(x = y
)と比較するために変数の前の値をロードすることを指示する項目があるかどうかはわかりません。
なぜ最初の式はにfalse
評価されtrue
ますが、2番目の式はに評価されますか?私は(x = y)
最初に評価されることを期待し、それからそれx
自体と比較して(3
)戻りtrue
ます。
この質問は異なっているJava式で部分式の評価順序という点で、x
ここでは間違いなく「部分式」ではありません。「評価」するのではなく、比較のためにロードする必要があります。質問はJava固有であり、表現はx == (x = y)
、一般的に巧妙なインタビューの質問のために作成された、遠くにある非実用的な構成とは異なり、実際のプロジェクトからのものです。これは、比較および置換イディオムの1行の置換であると想定されていました
int oldX = x;
x = y;
return oldX == y;
これは、x86 CMPXCHG命令よりもさらに単純であるため、Javaでは短い式に値します。
x = y
は確かに関連性がありx
、の値に設定される副作用を引き起こしますy
。