Questa domanda può sembrare stupida, ma perché 0valuta falsee ogni altro valore [intero] trueè la maggior parte dei linguaggi di programmazione?
Confronto delle stringhe
Dal momento che la domanda sembra un po 'troppo semplice, mi spiego un po' di più: prima di tutto, può sembrare evidente a qualsiasi programmatore, ma perché non ci dovrebbe essere un linguaggio di programmazione - in realtà potrebbe esserci, ma nessuno Ho usato - dove 0valuta truee tutti gli altri valori [interi] false? Quell'osservazione può sembrare casuale, ma ho alcuni esempi in cui potrebbe essere stata una buona idea. Prima di tutto, prendiamo l'esempio del confronto a tre stringhe, prenderò l'esempio di C strcmp: qualsiasi programmatore che prova C come prima lingua potrebbe essere tentato di scrivere il seguente codice:
if (strcmp(str1, str2)) { // Do something... }
Dato che strcmpritorna 0che valuta falsequando le stringhe sono uguali, ciò che il programmatore principiante ha tentato di fare fallisce miseramente e generalmente non capisce perché all'inizio. Avendo 0valutato trueinvece, questa funzione avrebbe potuto essere usata nella sua espressione più semplice - quella sopra - quando si confrontava per l'uguaglianza, e i controlli adeguati per -1e 1sarebbero stati fatti solo quando necessario. Avremmo considerato il tipo di ritorno come bool(nella nostra mente intendo) il più delle volte.
Inoltre, cerchiamo di introdurre un nuovo tipo, signche vuole solo i valori -1, 0e 1. Questo può essere molto utile. Immagina che ci sia un operatore di astronave in C ++ e lo vogliamo std::string(beh, c'è già la comparefunzione, ma l'operatore di astronave è più divertente). La dichiarazione sarebbe attualmente la seguente:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Era 0stato valutato true, l'operatore dell'astronave non esisterebbe, e avremmo potuto dichiararlo in operator==questo modo:
sign operator==(const std::string& lhs, const std::string& rhs);
Ciò operator==avrebbe gestito il confronto a tre vie contemporaneamente e potrebbe ancora essere utilizzato per eseguire il seguente controllo pur essendo in grado di verificare quale stringa è lessicograficamente superiore all'altra quando necessario:
if (str1 == str2) { // Do something... }
Gestione degli errori precedenti
Ora abbiamo delle eccezioni, quindi questa parte si applica solo alle vecchie lingue in cui non esiste nulla del genere (ad esempio C). Se guardiamo alla libreria standard di C (e anche a POSIX), possiamo vedere con certezza che le funzioni maaaaany ritornano 0quando hanno successo e qualsiasi numero intero altrimenti. Purtroppo ho visto alcune persone fare questo tipo di cose:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Se pensiamo a come pensiamo in programmazione, spesso abbiamo il seguente modello di ragionamento:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Se ci pensiamo di nuovo, avrebbe avuto senso mettere l'unico valore neutro,, 0a yes(ed è così che funzionano le funzioni di C), mentre tutti gli altri valori possono essere lì per risolvere i molti casi di no. Tuttavia, in tutti i linguaggi di programmazione che conosco (tranne forse alcuni linguaggi esoterici sperimentali), che yesvaluta falsein una ifcondizione, mentre tutti i nocasi valutano true. Ci sono molte situazioni in cui "funziona" rappresenta un caso mentre "non funziona" rappresenta molte probabili cause. Se ci pensiamo in questo modo, avere 0valutato truee il resto falseavrebbe avuto molto più senso.
Conclusione
La mia conclusione è essenzialmente la mia domanda originale: perché abbiamo progettato linguaggi dove 0sono falsee gli altri valori true, tenendo conto dei miei pochi esempi sopra e forse qualche altro a cui non ho pensato?
Follow-up: è bello vedere che ci sono molte risposte con molte idee e quante più ragioni possibili perché sia così. Adoro quanto ti sembri appassionato. Ho originariamente fatto questa domanda per noia, ma poiché sembri così appassionato, ho deciso di andare un po 'oltre e chiedere la logica alla base della scelta booleana per 0 e 1 su Math.SE :)
if true ; then ... ; fi, in cui trueè un comando che restituisce zero e che indica ifl'esecuzione ....
booltipo, ma se le condizioni ecc possono avere qualsiasi valore il confronto / ritorno.
strcmp()non è un buon esempio di vero o falso, in quanto restituisce 3 valori diversi. E rimarrai sorpreso quando inizi a usare una shell, dove 0 significa vero e qualsiasi altra cosa significa falso.