93

我遇到一個(貌似)很奇怪的情況。優先級和掩碼操作

乘坐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) 

威士忌。探戈。狐步舞。

我,無可否認,而不是當談到位運算符清晰的 - 所以也許我得可怕,可怕的錯誤的地方?

然而,在Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...這樣嗎?

+0

我在PHP但在C,C++,你可以簡單地寫爲'的var_dump(不(0b10和0B01) )' –

+2

Something weirder but:'0b0 + 1' evaluate to'2' in some versions,due to a parser bug。 – ikdc

回答

150

你實際上是這樣:

var_dump(0b10 & (0b01 == 0)); 
var_dump(0b10 & (0b01 != 0)); 

嘗試:

var_dump((0b10 & 0b01) == 0); 
var_dump((0b10 & 0b01) != 0); 
+6

在我看來,PHP的整體運算符優先。 –

+23

我想這就是爲什麼我**從不**任何語言依賴優先。此外,我認爲括號使代碼更具可讀性。在極端情況下,您可能需要(重新)分組和簡短評論。 –

+2

@AlvinWong你是對的!我認爲很少有代碼需要像'0b10&(0b01 == 0)'這樣的條件表達式,爲什麼有人會按比例應用沒有任何信息。 –