次の例を検討してください。
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。