我偶然发现了使用按位运算符的JavaScript情况。逻辑上,按位运算符应该具有比等于运算符更高的优先级,例如
if val & 10 == 10
alert('flag set')
但看起来这个代码会以另一种方式工作,因为在JavaScript中,按位运算符的优先级低于等式运算符(参见Mozilla's JS reference)。
对于任何有效的数字val,上面的代码总是返回0
,因为val & true
的结果是0
。因此,正确的方法是将括号括在逐位表达式中:
if (val & 10) == 10
alert('flag set')
我挖出了问题的历史,似乎这种行为来自K& R's C的时代,其中逻辑&&
和||
运算符是按比例添加的。
就C中的逻辑陈述而言:
if (x == 1 & y == 0) {
/* ... */
}
具有完美的感觉。但它在按位逻辑方面没有任何意义。
C ++,Java,Objective-C,PHP,C#,最后Javascript也有同样的方式。 Python,Ruby,Go反过来说。
您是否知道任何原因(除了来自C的遗产之外)使编程语言的设计师遵循C的优先规则?