2017-04-26 17 views
0

누군가가이 동작을 설명 할 수 있습니까? a^b이 변수에 저장 (또는 괄호에 싸여)되어 기본적으로하지 않는 JavaScript의 if 문에서 bitwise xor가 작동하지 않는 이유는 무엇입니까?

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); 
} 

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

, 그것은 작동하지 않습니다.

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

둘 모두 동일한 결과를 산출합니다.

에이미 내가 잘못했거나이 버그입니까? if 절 또는 다른 곳에있을 때 bitwise는 다르게 작동합니까? 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'을 계산하여 계속합니다. 사실 ... 제대로 이해했는지 테스트하기 위해 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