Öncelik ve bit maskesi işlemleri


94

(Görünüşe göre) çok garip bir vakayla karşılaştım.

2 numaralı (al 0b10() ve 1 ile bit maskesi 0b01)

Bu, 0b000'a eşdeğer olanı üretmelidir .

Ancak, Bay Schrödinger burada devreye giriyor:

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

Viski. Tango. Foxtrot.

Kuşkusuz, bitsel operatörler söz konusu olduğunda en keskin değilim - bu yüzden belki de bir yerlerde korkunç, korkunç bir şekilde yanılıyorum?

Ancak Python'da:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...yani?


PHP'de yok ama C, C ++ ile şöyle yazabilirsinizvar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
Yine de daha tuhaf bir şey: bir ayrıştırıcı hatası nedeniyle bazı sürümlerde 0b0+1değerlendirilir 2.
Lily Chung

Yanıtlar:


150

Aslında bunu yapıyorsun:

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

Deneyin:

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

6
Bana öyle geliyor ki, PHP genel olarak strnage operatörü önceliğine sahip.
Alvin Wong

23
Sanırım bu yüzden hiçbir dilde öncülüğe ASLA güvenmiyorum. Dahası, parantezlerin kodu daha okunaklı hale getirdiğini düşünüyorum. Aşırı durumlarda, bir şeyleri (yeniden) gruplandırmak ve kısa yorum yapmak isteyebilirsiniz.
Cevap yok

2
@AlvinWong Doğru söylüyorsun! Bence bir kod nadiren koşullu ifadeye ihtiyaç duyar 0b10 & (0b01 == 0).
Grijesh Chauhan

4
Pekala, daha yaygın bir örnek düşünün: Üçlü operatör, PHP bunu geriye doğru taşır, bu da onu diğer tüm dillerden farklı kılar. Ref: phpsadness
Alvin Wong

5
Bu yüzden C ve C ++ 'da insanlar bu şeyler için uyarılara sahipler.
PlasmaHH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.