2017-04-26 79 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

相关问题