Questa domanda può sembrare stupida, ma perché 0
valuta in false
e qualsiasi altro [valore intero] in true
è la maggior parte dei linguaggi di programmazione?
Confronto tra stringhe
Dato che la domanda sembra un po 'troppo semplice, mi spiegherò un po' di più: prima di tutto, potrebbe sembrare evidente a qualsiasi programmatore, ma perché non ci sarebbe un linguaggio di programmazione - potrebbe esserci effettivamente, ma non ne ho usato nessuno - dove 0
valuta a true
e tutti gli altri valori [interi] a false
? Quella 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 vie delle stringhe, prenderò come esempio il strcmp
di C: qualsiasi programmatore che prova C come sua prima lingua potrebbe essere tentato di scrivere il seguente codice:
if (strcmp(str1, str2)) { // Do something... }
Poiché strcmp
restituisce 0
che restituisce false
quando le stringhe sono uguali, ciò che il programmatore iniziale ha cercato di fare fallisce miseramente e generalmente non capisce perché all'inizio. Se 0
fosse stato valutato a true
, questa funzione avrebbe potuto essere utilizzata nella sua espressione più semplice, quella sopra, quando si confrontava per l'uguaglianza, e i controlli appropriati per -1
e 1
sarebbero stati eseguiti solo quando necessario. Avremmo considerato il tipo di ritorno come bool
(nella nostra mente, intendo) la maggior parte del tempo.
Inoltre, introduciamo un nuovo tipo, sign
, che prende 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 per std::string
(beh, c'è già il 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);
Had 0
è stato valutato a true
, l'operatore di astronave non esisterebbe nemmeno e potremmo aver dichiarato operator==
in questo modo:
sign operator==(const std::string& lhs, const std::string& rhs);
Questo operator==
avrebbe gestito il confronto a tre vie in una sola volta, 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 (C per esempio). Se guardiamo alla libreria standard di C (e anche a POSIX), possiamo vedere con certezza che le funzioni di maaaaany restituiscono 0
quando ha successo e qualsiasi numero intero altrimenti. Ho visto tristemente che alcune persone fanno questo genere di cose:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Se pensiamo a come pensiamo nella programmazione, spesso abbiamo il seguente schema 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 il problema molti casi di no
. Tuttavia, in tutti i linguaggi di programmazione che conosco (tranne forse alcuni linguaggi esoterici sperimentali), che yes
valuta in false
in una condizione if
, mentre tutti i casi no
valutano in true
. Ci sono molte situazioni in cui "funziona" rappresenta un caso mentre "non funziona" rappresenta molte cause probabili. Se ci pensiamo in questo modo, avere 0
valuta a true
e il resto a false
avrebbe avuto molto più senso.
Conclusione
La mia conclusione è essenzialmente la mia domanda iniziale: perché abbiamo progettato linguaggi in cui 0
è false
e gli altri valori sono true
, prendendo in considerazione i miei pochi esempi sopra e forse qualcosa in più a cui non avevo pensato?
Follow-up: È bello vedere che ci sono molte risposte con molte idee e tante possibili ragioni per farlo. Amo quanto ti sembra appassionato. Ho fatto questa domanda originariamente per noia, ma visto che sembri così appassionato, ho deciso di andare un po 'oltre e di chiedere alla logica dietro la scelta booleana per 0 e 1 su Math.SE:)