Neden bitsel operatörler karşılaştırmalardan daha düşük önceliğe sahip?


63

Birisi gerekçeyi açıklayabilir mi, neden birçok popüler dilde (aşağıdaki nota bakınız) karşılaştırma işleçleri (==,! =, <,>, <=,> =) Bitsel operatörlerden daha yüksek önceliğe sahip olabilir (&, |, ^ , ~)?

Bu önceliğin doğal olacağı bir kullanımla karşılaştığımı sanmıyorum. Her zaman gibi şeyler:

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

Kullanacağım davalar:

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

var olmayanlara yakındır.

Dil tasarımcılarının operatörlerin bu şekilde önceliğine karar verme motivasyonu neydi?


Örneğin, en iyi 12 dilde SQL dışındaki herkes langpop.com'daki Programlama Dili Popülerliği listesinde olduğu gibidir: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.


16
Özgün tasarımdaki C hata
cırcır ucube

7
@gnat, bu şikayetin amacı nedir? OP, “hepsi”, sadece “en popüler dillerden bir demet” demedi. Ve büyük çoğunluk da bu emri takip ediyor. Bu tabloda, ilk 12’den (SQL) yalnızca biri yok: langpop.com

3
@ dan1111, doğal olarak, cevaplayıcıların sorulan soruyu daha iyi anlamalarına ve daha iyi cevaplar sağlamalarına yardımcı olmaktır. Görüyorsunuz, burası Guessing Game için bir yer değil - ya da tur sayfasının dediği gibi "Bu bir tartışma forumu değil. Chit-chat yok."
gnat

7
@gnat, oyunları tahmin etme konusundaki endişenize katılıyorum, ancak neredeyse her popüler dil tanımlanmış davranışı gösterdiğinde bunun uygun olduğunu sanmıyorum.

5
@Dunk: Ortak "kambur" yaklaşımıdır [arithmetics] [logic operator] [arithmetics]. Çoğu programcı parantez dağınıklığı yaratmaz if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))- çoğu mantıklara göre aritmetik önceliğini üstlenir ve yukarıdakilerin if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() )) önceliğini varsayar . Şimdi sezgisel olarak aynı davranmalıdır, XOR aritmetik operatörüdür. Olarak yorumlanması gerçeği tamamen sezgiseldir. +<if( x ^ getMask() != PATTERN )if( x ^ ( getMask() != PATTERN ) )
SF.

Yanıtlar:


72

Diller, C'den ve C'den Dennis Ritchie'nin başlangıçta B'de (ve belki de erken C'de), içeriğe bağlı olarak bitsel ve veya mantıklı bir dilekçenin tek bir formu olduğunu açıkladı& . Daha sonra, her bir fonksiyon kendi operatörünü elde etti: &bitsel olan &&için ve mantıklı olan için. Sonra devam ediyor

Onların gecikmeli tanıtımı, C'nin öncelik kurallarının belirsizliğini açıklar. B de biri yazıyor

if (a == b & c) ...

olmadığını kontrol etmek için aeşittir bve cbir sıfır olmayan; böyle bir şartlı ifadede, &öncekinden daha düşük önceliğe sahip olmak daha iyidir ==. B'den C'ye dönüştürülmesi, bir yerine istediği &ile &&bu açıklamada; dönüşümün daha az acı verici hale gelmesi için &operatörün önceliğini aynı göreceli olarak tutmaya karar verdik ==ve sadece önceliğini &&biraz önceliğe bölmeye karar verdik &. Bugün, bunun göreceli biçiminde tanımlanmaktadır taşımak için tercih olurdu görünüyor &ve ==ve böylece ortak bir C deyim basitleştirmek: Başka bir değere karşı maskeli değerini test etmek için, tek yazmalısınız

if ((a & mask) == b) ...

İç parantez içinde gerekli, ancak kolayca unutulur.


1
c=2Ya da a==bsonuçlanıp sonuçlanmasaydı bu başarısız ~0olmaz 1mıydı?
SF.

Öyle görünüyor, a == b 0 veya 1 döndürür, bkz. Cm.bell-labs.com/cm/cs/who/dmr/kbman.html .
AProgrammer

Cevaptaki referansı kontrol edin ve önceki metni okuyun.
SShaheen

1
@MasonWheeler: Özellikle gömülü sistemlerde, bazen işlev benzeri makrolar kullanmak gerekli olabilir (bazı durumlarda, sıralı işlevlerden ve kritik olabilecek bazı gömülü sistemlerde daha büyük siparişler sunabilir). Bu tür makrolarda değişken bildirimi mümkün değildir; Makroda global bir değişken kullanmak işe yarayabilir, ancak çok gergin görünüyor.
supercat,

6
@MasonWheeler: Ahududu Pi ya da Arduino'yu 1000 dolarlık 0,50 dolara bulabilir misiniz?
supercat,

7

Bitsel operatörler, öncelik tablosunda neden birbirlerine yakın olduklarını açıklayan, hem kavramsal olarak hem de görünüş olarak mantıksal operatörlerle ilgilidir. Belki bir kişi daha &yüksek olmak için kafa karıştırıcı olacağını ==, ancak o &&zaman daha düşük olabileceğini iddia edebilir ==.

Bir öncelik önceliği (!) Belirlendiğinde, tutarlılık uğruna onu takip etmek diğer diller için muhtemelen daha iyiydi.

Ancak, bunun optimal olmadığı konusunda sizinle aynı fikirdeyim. Gerçek kullanımda, bit operatörleri mantıksal olanlardan çok matematiksel operatörler gibidir ve öncelikli olarak matematiksel operatörler ile gruplandırılmışlarsa daha iyi olur.

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.