2017-04-26 13 views
0

誰かがこの動作を説明できますか?JavaScriptのif文でbitwise xorが動作しないのはなぜですか?

https://jsfiddle.net/td1qtyxL/9/

function checkSignsWeird(a,b){ 
    var output = ""; 
    if(a^b < 0){ 
     output = "The "+a+" and "+b+" have DIFFERENT signs."; 
    }else{ 
     output = "The "+a+" and "+b+" have the SAME sign."; 
    } 
    console.log(output); 
} 

a^bを変数に格納されている(または括弧に包まれた)されていない限り、基本的には動作しません。

checkSignsWeird(-50,40); 
checkSignsWeird(60,70); 

どちらも同じ結果をもたらします。

エイミー私は何か間違っているか、これはバグですか?それがif節にあるときや、別の場所にあるときにビット単位で動作するかどうかは異なりますか?私は、多くの場合、ビット単位で動作するだけで、これはエレガントだと思った、ここからの回答をフォローしていない:Check if two integers have the same sign

+0

プログラミング言語を指定してください。 JS –

+0

のように見えます。忘れて申し訳ありません:) – Firsh

+2

おそらく[*演算子優先順位*](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)? – RobG

答えて

2

「より小さい」(<)は、ビットごとのXOR(^)よりも優先順位が高い:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

操作をかっこでグループ化する必要があります。

+1

それでは、カッコで囲まれていないのは、最初に 'b <0'(bが40または70)かどうかをチェックし、それを' false'に評価して '-50'を実行し続けます。 true ... 私が正しく理解したかどうかをテストするには、 'checkSignsWeird(0,1);'を実行し、最後にelseブランチから結果を表示しました。 '1 <0'はfalseを意味し、' 0^false'は '0'と評価され、falseになります。ニース。 – Firsh

2

ビット演算子は、比較演算子よりも優先順位が低くなります。 Operator precedenceを参照してください。

言われているように、巧妙なコードを書いてはいけません。

function haveSameSign(a, b) { 
    return (a >= 0 && b >= 0) || (a < 0 && b < 0); 
} 
+0

なぜですか?これは私たちが学ぶ方法ではありませんか?簡単な解決法よりも巧みな方が好ましいシナリオはありますか? – Firsh

+0

「巧妙な」コードは、明らかではなく、保守が難しく、エラーを起こしやすく、通常、それを書いた人の自我を撫でる以外の目的を果たしません。避ける。理解するためにコメントを必要としない、死んだ明白なコードを書く。 – Tomalak

関連する問題