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


105

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

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

なぜこれがFALSEと表示されるのですか?


1
実行して確認します。falseを割り当てた場合とtrueを割り当てた場合に出力されるブール値を確認します。次に、ORの仕組みを読んでください。
Pratik 2015

2
このコードがデバッグモードでTRUE値を与え、実行モードでFALSE値を与えることを伝えたい...なぜそうなのか??? ...(ブレークポイントをif条件に置く)...
CoderNeji

test1=falsetest1==falseあるfalsefalse || falseあるfalse or falseありますfalse
Jared Burrows、2015

私はあなたがアドバイスを求めていなかったのを知っていますが、以下の回答が優先順位の問題を特定するので、トラブルを回避するのに役立ついくつかのプラクティスがあります(私がこれらに固執する場合):(1)100%でない場合は常に括弧を使用します特定の優先順位、または他の開発者を支援するための読みやすさのため。他の人がすべての演算子の優先規則を覚えていると思い込まないでください(2)非常に単純なif条件を除いて、混乱を減らすために一般的にif割り当ては避けるべきです。いくつかの一般的な例外があります(特に、I / O、ネットワークなどの単純なチェックの場合)。ちょうど私の2セント。
rimsky 2015

なぜならtest1 = true
jono 2015

回答:


189

式は、あなたが考える方法では解析されません。そうではありません

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

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

test1 = (false || test1 == false)

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

このように解析される理由は、の優先順位が演算子の優先順位よりも||低く==、代入演算子の優先順位よりも高いためです=


2
+1 @RohanFernandoのように、割り当ての前後に角かっこを追加すると((test1 = false) || test1 == false)、全体的な値がになることにも注意してくださいtrue
Arnon Zilca、2015

1
解析が行われる理由を書いてください...演算子の優先順位のためか?
kondu 2015

3
@konduこれはかなりフォローアップの質問です。優先順位表にリンクを追加するように編集しました。これは、==||にある=が下にあることを示しています||
dasblinkenlight 2015

最後の段落は誤解を招くものです。なぜ最初の構文解析ではなく2番目の構文解析が選択されるのかを理解するには、割り当てが非割り当て演算子よりも優先順位が低い(ここで覚えている)ルールを知っていれば十分||です(ここ)。相対的な優先度||とは、==その解析はであることを示すためにのみ関連していないのようにtest1 = ((false || test1) == false)私は誰もが合理的に、より一般的にする方法で(つまり相対的な優先度を期待し、かとは思わないもの、 ||&&関係よりも低い優先順位を持っているにも簡単です常に使用されているため、覚えておいてください)。
Marc van Leeuwen

1
相対的な優先@MarcvanLeeuwen ||==対を||して=、なぜこの振る舞いは違っの(共通)の場合から説明しますa == b || c == d
アーロンデュフォー

83

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

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

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

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

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

if (test1 = (false || false))

(最初からtest1ですtrue

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

if (test1 = false)

その値を代入falsetest1、発現された結果と、false

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


2

演算子の優先順位をご覧ください

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

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

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

ステップ:3- test1 = false

ステップ:4- false

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


-11

(test1 = false || test1 == false)どちらもfalseであるため、falseを返します。(test1 = false || test1 == true)それらのうちの1つが真実であるので、これは真実です


1
完全に間違っています。質問が何が起こるかを説明する2つの高品質の回答を受け取った後、なぜそのような誤った情報で答えるのですか
l4mpi

5
このような低品質の2つの答えは、個別に書かれたコメントに値しません。あなたは自分の答えがナンセンスだと気づいていますよね?そうでない場合は、Jonとblinkenlightの2つの答えを注意深く読んでください。
l4mpi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.