web-dev-qa-db-ja.com

代入と等価性チェックを伴うifステートメントがfalseと評価されるのはなぜですか?

Java ifステートメントは、割り当てと等価性チェックOR- dが一緒にある場合、どのように機能しますか??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

なぜこの印刷は偽ですか?

103
RoHaN

式は、あなたが考えているように解析されません。そうではありません

(test1=false) || (test1 == false)

その場合、結果はtrueになりますが、

test1 = (false || test1 == false)

false || test1 == falseの値は最初に計算され、falseです。これは、test1trueに設定されているためです。

このように解析される理由は、||precedence==演算子のそれよりも低いが、割り当て演算子=の優先順位よりも高いためです。

188
dasblinkenlight

これは基本的に優先順位の問題です。あなたのコードは次のものと同等であると仮定しています:

if ((test1 = false) || (test1 == false))

...しかし、そうではありません。実際には次と同等です:

if (test1 = (false || test1 == false))

...これは次と同等です:

if (test1 = (false || false))

test1は最初はtrueであるため)

...これは次と同等です:

if (test1 = false)

falsetest1に割り当て、式の結果はfalseになります。

演算子の優先順位の有用な表については、 演算子に関するJavaチュートリアル を参照してください。

83
Jon Skeet

please have a look over precedence of operators

test1 = false || test1 == falseは、次のステップで評価されます。

STEP:1-test1 = false || test1 == false // _==の優先順位が最も高い

STEP:2-test1 = false || false //演算子||の優先度が高い

ステップ:3-test1 = false

ステップ:4-false

式のブール値がfalseになるため、elseステートメントが実行されます。

2
user4768611