Bu soru dilsiz gelebilir, ama neden yok 0etmek değerlendirir falseve başka bir [tamsayı] değer trueprogramlama 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 0değ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:truefalsestrcmp
if (strcmp(str1, str2)) { // Do something... }
Yana strcmpdöner 0sonucunu falsebaş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 0değerlendirilmiş olsaydı true, bu işlev, eşitliği karşılaştırırken en basit ifadesinde - yukarıda belirtilen - kullanılmış olabilirdi -1ve 1yalnı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ı, signsadece değerleri alan yeni bir tür sunalım -1, 0ve 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 comparefonksiyon 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ı 0hiç 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 0baş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 yesolarak değerlendirilen falsebir in iftüm bunlar olurken, durumun novakalar 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, 0değerlendirmek trueve gerisini değerlendirmek falseçok daha anlamlı olurdu.
Sonuç
Nerede neden dilleri tasarladın: Benim sonuç aslında benim orijinal soru 0olduğunu falseve diğer değerlerdir truebenim 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 truesıfır döndüren bir komut ve bu söyler ifçalıştırmak için ....
booltü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.