TL; DR
C !
ve ~
işleçlerini başka bir dilden miras aldı. Hem &&
ve ||
farklı bir kişi tarafından yıl sonra eklenmiştir.
Uzun cevap
Tarihsel olarak, C, Algol'a dayanan CPL'ye dayanan BCPL'ye dayanan B'nin ilk dillerinden gelişmiştir.
C ++, Java ve C # 'nin büyük büyükbabası Algol , programcıların sezgisel göründüğü bir şekilde doğru ve yanlış olarak tanımlandı: “İkili sayı olarak kabul edilen (1'e karşılık gelen ve 0'a yanlış olan) gerçek değerler içsel integral değeri ile aynı ”. Bununla birlikte, bunun bir dezavantajı, mantıksal ve bitsel olarak aynı işlem olamaz: Herhangi bir modern bilgisayarda, ~0
1 yerine 1'e ve 1 yerine ~1
-2'ye eşittir. (Altmış yıllık bir ana bilgisayarda bile ~0
- 0 veya INT_MIN
, ~0 != 1
şimdiye kadar yapılmış her bir CPU'da ve C dili standardı yıllarca gerekliyken, kız dillerinin çoğu işaret ve büyüklük veya bir tamamlayıcısını desteklemeye bile zahmet etmiyor.)
Algol bunun için farklı modlara sahip ve operatörleri boolean ve integral modda farklı şekilde yorumlayarak çalıştı. Yani, bitsel bir işlem tamsayı tiplerinde ve mantıksal bir işlem ise boolean tiplerde oldu.
BCPL ayrı bir boolean tipine sahipti, fakat hem bitsel hem de mantıksal olmayan tek bir not
operatör vardı . C'nin bu erken öncüsünün bu işi yapması:
Gerçek değerinin değeri, tamamıyla bunlardan oluşan bir bit desenidir; false değeri sıfırdır.
Bunu not et true = ~ false
( Değer teriminin , C-ailesi dillerinde tamamen farklı bir şey ifade etmek için geliştiğini göreceksiniz . Bugün C de “nesne temsili” diyoruz.)
Bu tanım, aynı makine dili komutunun kullanılmamasını mantıklı ve bitsel olarak sağlar. C o rotayı takip etseydi, üstbilgi dosyaları dünyanın üzerinde olduğunu söylerdi #define TRUE -1
.
Ancak B programlama dili zayıf yazılmış ve boolean veya hatta kayan noktalı tipler yoktu. Her şey, int
halefi C'nin karşılığıydı . Bu, bir programın bir programın bir mantıksal değer olarak doğru veya yanlış bir değer dışında bir değer kullanması durumunda ne olduğunu tanımlaması için iyi bir fikirdir. İlk önce bir truthy ifadesini “sıfıra eşit değil” olarak tanımladı. Bu, üzerinde çalıştığı ve CPU sıfır bayrağı bulunan mini bilgisayarlarda etkiliydi.
O zamanlar bir alternatif vardı: aynı CPU'ların da olumsuz bir bayrağı vardı ve BCPL'nin gerçeği değeri -1 idi, bu nedenle B bunun yerine bütün negatif sayıları gerçeğe uygun, bütün negatif olmayan sayıları sahte olarak tanımlamış olabilirdi. (Bu yaklaşımın bir kalıntısı var: aynı zamanda aynı insanlar tarafından geliştirilen UNIX'teki birçok sistem çağrısı, tüm hata kodlarını negatif tam sayılar olarak tanımlar. Sistem çağrılarının çoğu başarısızlık durumunda birkaç farklı negatif değerden birini döndürür.) şükretmek: daha kötü olabilirdi!
Ama tanımlama TRUE
olarak 1
ve FALSE
sıra 0
B'de kimlik anlamına geliyordu true = ~ false
artık tutulan ve bitwise ve mantıksal ifadeleri arasındaki belirsizliği giderecek Algol izin güçlü yazarak düşmüştü. Bu, yeni bir mantıksal olmayan operatör gerektiriyordu ve tasarımcılar !
, muhtemelen eşit değillerdi, çünkü !=
eşit bir işaretten dikey bir çubuk gibi görünüyorlardı. Aynı sözleşmeyi takip etmediler &&
ya da ||
henüz olmadıklarından dolayı.
Muhtemelen, olmalıdır: &
B'deki operatör tasarlandığı gibi bozuldu. B ve C, de 1 & 2 == FALSE
olsa 1
ve 2
her iki truthy değerleri ve orada Cı ilave ederek kısmen düzeltilmesi çalıştı bir hata B'deki mantıksal işlemi ifade etmek için kolay bir yoldur &&
ve ||
ancak zamanda ana endişe oldu Sonunda çalışmak için kısa devre yapmak ve programların daha hızlı çalışmasını sağlamak. Bunun ispatı şudur ^^
: hayır : 1 ^ 2
Her ikisi de operandları truthy olsa da bir gerçeği değeridir, ancak kısa devreden faydalanamaz.