Bu soru dilsiz gelebilir, ama neden yok 0
etmek değerlendirir false
ve başka bir [tamsayı] değer true
programlama dillerinin en çok?
Dize karşılaştırması
Soru biraz fazla basit göründüğü için, kendimi biraz daha açıklayacağım: Her şeyden önce, herhangi bir programcıya açık gelebilir, ama neden bir programlama dili olmasaydı - aslında olabilir, ama hiçbiri Ben kullandım - ve diğer tüm [integer] değerlerini nerede 0
değerlendirir ? Bu sözler rastlantısal görünebilir, ancak iyi bir fikir olabileceği birkaç örneğim var. Her şeyden önce, üç yollu karşılaştırma dizesini ele alalım, C'yi örnek alacağım : ilk dili olarak C'yi deneyen herhangi bir programcı aşağıdaki kodu yazmaya başlayabilir:true
false
strcmp
if (strcmp(str1, str2)) { // Do something... }
Yana strcmp
döner 0
sonucunu false
başlayan programcı yapmaya çalıştığım da buydu dizeleri eşit olduğunda, sefil başarısız olur ve o genellikle neden ilk anlamıyor. Bunun yerine 0
değerlendirilmiş olsaydı true
, bu işlev, eşitliği karşılaştırırken en basit ifadesinde - yukarıda belirtilen - kullanılmış olabilirdi -1
ve 1
yalnızca gerekli olduğunda uygun kontroller yapılıyordu. Dönüş türünü bool
çoğu zaman (aklımızda demek istediğim) olarak kabul ederdik .
Dahası, sign
sadece değerleri alan yeni bir tür sunalım -1
, 0
ve 1
. Bu oldukça kullanışlı olabilir. C ++ 'ta bir uzay gemisi operatörü olduğunu hayal edin ve bunun için istediğimizi std::string
(iyi, zaten bir compare
fonksiyon var, ancak uzay gemisi operatörü daha eğlenceli). Deklarasyon şu anda aşağıdaki olurdu:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Olsaydı 0
hiç değerlendirilmemiştir true
, uzay gemisi operatörü bile var olamazdı ve biz ilan olabilirdi operator==
bu şekilde:
sign operator==(const std::string& lhs, const std::string& rhs);
Bu operator==
, bir kerede üç yönlü karşılaştırma yapmalıydı ve yine de, hangi dize gerektiğinde sözlükten daha üstün olduğunu kontrol edebiliyorken aşağıdaki kontrolü yapmak için de kullanılabilirdi:
if (str1 == str2) { // Do something... }
Eski hata işlemesi
Şimdi istisnalarımız var, bu yüzden bu kısım sadece böyle bir şeyin olmadığı eski diller için geçerlidir (örneğin C). C'nin standart kütüphanesine bakarsak (ve POSIX bir tane de), maaaaany işlevlerinin 0
başarılı olduğunda ve herhangi bir tamsayıda geri döndüğünden emin olabiliriz . Ne yazık ki bazı insanların böyle şeyler yaptığını gördüm:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Programlamada nasıl düşündüğümüzü düşünürsek, genellikle aşağıdaki akıl yürütme düzenine sahibiz:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Tekrar düşün, bu, sadece nötr değere koymak için mantıklı olurdu 0
, hiç yes
(ve bu C'nin fonksiyonları çalışır nasıl) tüm diğer değerler olabilir birçok durumda çözmek için ise, no
. Ancak, tek bildiğim programlama dillerinde (belki bazı deneysel esotheric diller hariç), o yes
olarak değerlendirilen false
bir in if
tüm bunlar olurken, durumun no
vakalar için değerlendirmek true
. “Çalışıyor” un bir vakayı temsil ettiği, “Çalışmıyor” un pek çok olası nedeni temsil ettiği birçok durum vardır. Bu şekilde düşünürsek, 0
değerlendirmek true
ve gerisini değerlendirmek false
çok daha anlamlı olurdu.
Sonuç
Nerede neden dilleri tasarladın: Benim sonuç aslında benim orijinal soru 0
olduğunu false
ve diğer değerlerdir true
benim birkaç örnek üzerinde ve belki biraz daha düşünmüyordu hesabında alarak?
Takip: Pek çok fikri olan birçok cevabı ve böyle olması için olası sebepleri görmek güzel. Ne kadar tutkulu olduğunuzu seviyorum. Orijinal olarak bu soruyu sıkıntıdan sordum, ama çok tutkulu göründüğünüz için biraz daha ileri gitmeye karar verdim ve Boolean'ın arkasındaki mantık hakkında 0 ve 1 Math.SE için sormaya karar verdim :)
if true ; then ... ; fi
, nereye true
sıfır döndüren bir komut ve bu söyler if
çalıştırmak için ...
.
bool
türü ancak karşılaştırmalar / koşullar vb olabilir varsa dönüş değeri.
strcmp()
doğru veya yanlış için iyi bir örnek değildir, çünkü 3 farklı değer döndürür. Ve bir kabuk kullanmaya başladığınızda, 0'ın doğru ve başka bir şeyin yanlış olduğu anlamına geldiğinde şaşıracaksınız.