优先级和位掩码操作

inf*_*iac 94 php bit-manipulation bitwise-operators operator-precedence

我遇到过一个(看似很奇怪的)非常奇怪的案子.

取数字2(0b10)并用1(0b01)进行位掩码

这应该产生0b00相当于0的东西.

然而,这里是薛定谔先生进来的地方:

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)
Run Code Online (Sandbox Code Playgroud)

威士忌酒.探戈.狐步舞.

不可否认,对于按位运算符来说,我并不是最敏锐的 - 所以也许我在某个地方有可怕的,可怕的错误?

但是,在Python中:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...所以?

Mat*_*hew 150

你实际上是这样做的:

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));
Run Code Online (Sandbox Code Playgroud)

尝试:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Run Code Online (Sandbox Code Playgroud)

  • 我猜这就是为什么我**永远不要依赖任何语言的优先权.而且,我认为括号使代码更具可读性.在极端情况下,您可能希望(重新)分组和简短评论. (23认同)
  • 在我看来,PHP总体上具有strnage运算符优先级. (6认同)
  • 这就是为什么在C和C++中人们会对这些事情发出警告. (5认同)
  • 好吧,考虑一个更常见的例子:三元运算符,PHP将它向后反转,使其与所有其他语言不同.参考:phpsadness (4认同)
  • @AlvinWong你是对的!我认为很少有代码需要条件表达式,比如`0b10&(0b01 == 0)`为什么有人会按比例应用是否有任何信息. (2认同)