2017-04-26 102 views
0

有人可以解釋這種行爲嗎?爲什麼不按位xor在if語句中工作?

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語句處於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

的「小於」(<)具有比按位異或(^)更高的優先級:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

您需要將操作與括號分組。

+1

那麼沒有括號的是什麼是它首先檢查是否b <0(b是40或70),評估它爲「假」,然後繼續執行「-50^false」,這是「-50」計數爲真... 只是爲了測試,如果我理解正確我跑'checkSignsWeird(0,1);'它終於顯示從其他分支的結果。 「1 <0」表示錯誤,則表示爲'0',表示爲'0',而錯誤則爲'0'。尼斯。 – Firsh

2

按位運算符的優先級低於比較運算符。見Operator precedence

也就是說,不要寫出聰明的代碼。

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

爲什麼不呢?這不是我們學習的方式嗎?有沒有一種情況比其他的解決方案更適合聰明? – Firsh

+0

「聰明」的代碼不明顯,難以維護,容易出錯,除了撫摸寫作者的自我之外通常沒有任何其他用途。避免。寫死不明顯的代碼,不需要評論來理解。 – Tomalak