2011-01-13 18 views
29

C programlama dilinde neden bitlik işleçler (& ve |) eşitlik operatöründen (==) daha düşük önceliğe sahiptir? Benim için mantıklı değil.Kullanıcı önceliği (bitwise '&' küçüktür '==')

+2

Çünkü bu şekilde tasarlandı. Ayrıca, parantezler ucuzdur. – CanSpice

+0

Neden size mantıklı gelmiyor? – peoro

+12

(a & b == c) ifadesinin kullanıldığı durumlarda yakalandım, neden çalışmadığını öğrenmek için biraz zaman harcadım. – poida

cevap

44

Brian Kernighan veya Dennis Ritchie'ye sormanız gerekir. Bu forumda itibaren
: http://bytes.com/topic/c/answers/167377-operator-precedence

& & ve || operatörler daha sonra "kısa devre" davranışları için eklenmiştir. Dennis Ritchie, numaralı belgede, mantıksal işleçler eklendiğinde bitly işleçlerin önceliğinin değiştirilmiş olması gerektiğini geriye doğru inceler. Ama yüz birkaç o noktada varlığı C kaynak kodunu kilobayt ve üç bilgisayarların bir yüklü tabanıyla birlikte Dennis, Eee ... C dilinde bir değişimin çok büyük olurdu

düşünce Bu bir sebep olabilir mi? Tahminimce bitümden beri varolan çırpınan (ilişkilerin karşılaştırılmasından farklı olarak) birkaç bitümlü bitüm katmanı vardır, çünkü sonsuza dek ... ve asla düzeltilmemiştir.

+13

Lanetlendi. Laziness :( –

+0

Doomed Bu alıntı aslında yanlış sıralanmıştır Dennis Ritchie, kendi kendini "Chistory" adlı makalesinde şöyle açıklar: Burada okuyabilirsiniz (http://cm.bell-labs.co/who/dmr/chist). html) Bence Ritchie'nin ifadesi çok daha iyi.Ritchie, önceliğe sahip olduğundan pişmanlık duymuştu, fakat, C dilini oluştururken, B'nin, C'nin öncülü olandan, minimal dönüşüm sürtünmesi için yapıldı. B sadece hücreler üzerinde '&' destekliydi ve B tipi bir sistem eksikliğinden dolayı açık bir boole operatörüne sahip değildi. Bu aynı zamanda "gerçek" in neden "0 değil" anlamına geldiğini - bitsel AND'nin her zaman mükemmel bir sonuç vermediğini açıklıyor. – Qix

+0

Ama '==' kısa devre yapan bir operatör değil, bu yüzden bu soruya nasıl cevap veriyor? Bununla birlikte, @Qix'e teşekkürler, çünkü yorumunuz ayrıca bitsel operatörlerin neden farklı (göründüğü gibi) önceliklere sahip olduklarını açıklıyor - B'den gelenler [B Öğretici Ek D] 'de görüldüğü gibi (https: //www.bell- labs.com/usr/dmr/www/btut.html)_ (beni rahatsız eden bir soru). (Ve benim tahminimce B bu şekilde başka hiçbir sebepten ötürü bu tür bir ifade dilbilgisi ile tekrarlayan bir soy ayrıştırıcısı yazmak kolay değildir.) – davidbak

3

K & R'nin neden yaptıkları önceliği seçtiğine dair yetkili bir cevabım yok. anlamda adil bir miktar bu bir olurdu yapar bir örnek: Bu bitler halinde VE operatörü kullandığı yana

if (x == 1 & y == 0) { 
    /* ... */ 
} 

olmayan bir kısa devre

if (x == 1 | y == 0) { 
    /* ... */ 
} 

kullandığınız gibi, değerlendirme modu kısa devre yapmayan VEYA operatör. Muhtemelen öncelikli gruba bu şekilde sahip olmayı seçtiler, ama ben size katılıyorum ki geçmişe bakıldığında iyi bir fikir gibi görünmüyor.

+2

Bu hiçbir anlam ifade etmiyor. Bu durumda neden mantıklı bir işlem yerine bitsel operatörü kullanıyorsunuz? –

+3

@Nathan Fellman- Caladain'in cevabı kafasına çarptı. – templatetypedef

+0

Sağ. '&' Ve '|' nin önceliği mantıksal işleçler olarak mükemmel bir anlam taşır, ancak bitly operatörler kadar az anlam ifade eder. – dan04