Questa domanda può sembrare stupida, ma perché 0
valuta false
e 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 0
valuta true
e 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 strcmp
ritorna 0
che valuta false
quando le stringhe sono uguali, ciò che il programmatore principiante ha tentato di fare fallisce miseramente e generalmente non capisce perché all'inizio. Avendo 0
valutato true
invece, questa funzione avrebbe potuto essere usata nella sua espressione più semplice - quella sopra - quando si confrontava per l'uguaglianza, e i controlli adeguati per -1
e 1
sarebbero 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, sign
che vuole solo i valori -1
, 0
e 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 compare
funzione, ma l'operatore di astronave è più divertente). La dichiarazione sarebbe attualmente la seguente:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Era 0
stato 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 0
quando 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,, 0
a 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 yes
valuta false
in una if
condizione, mentre tutti i no
casi 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 0
valutato true
e il resto false
avrebbe avuto molto più senso.
Conclusione
La mia conclusione è essenzialmente la mia domanda originale: perché abbiamo progettato linguaggi dove 0
sono false
e 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 if
l'esecuzione ...
.
bool
tipo, 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.