Cette question peut sembler stupide, mais pourquoi 0
évalue-t-elle false
et toute autre valeur [entière] true
est la plupart des langages de programmation?
Comparaison de chaîne
Comme la question semble un peu trop simple, je vais en expliquer un peu plus: tout d’abord, cela peut sembler évident à tout programmeur, mais pourquoi n’y aurait-il pas un langage de programmation - il se peut qu’il en existe, mais pas n'importe lequel. J'ai utilisé - où 0
évalue true
et toutes les autres valeurs [entier] à false
? Cette remarque peut sembler aléatoire, mais j’ai quelques exemples où cela aurait pu être une bonne idée. Tout d'abord, prenons l'exemple de la comparaison tridirectionnelle de chaînes, je prendrai strcmp
comme exemple l'exemple de C : tout programmeur essayant d'utiliser C comme première langue peut être tenté d'écrire le code suivant:
if (strcmp(str1, str2)) { // Do something... }
Depuis strcmp
return, 0
qui évalue à false
quand les chaînes sont égales, ce que le programmeur a essayé de faire échoue lamentablement et il ne comprend généralement pas pourquoi au début. Si elle avait été 0
évaluée à la true
place, cette fonction aurait pu être utilisée dans sa plus simple expression - celle ci-dessus - pour comparer l'égalité et les vérifications appropriées pour -1
et 1
n'auraient été effectuées qu'en cas de besoin. Nous aurions considéré le type de retour comme bool
(dans notre esprit je veux dire) la plupart du temps.
De plus, introduisons un nouveau type sign
, qui prend juste des valeurs -1
, 0
et 1
. Cela peut être très pratique. Imaginez qu'il y ait un opérateur de vaisseau spatial en C ++ et que nous le voulions std::string
bien (bon, il y a déjà une compare
fonction, mais l'opérateur de vaisseau spatial est plus amusant). La déclaration serait actuellement la suivante:
sign operator<=>(const std::string& lhs, const std::string& rhs);
S'il avait 0
été évalué true
, l'opérateur du vaisseau spatial n'existerait même pas, et nous aurions pu le déclarer operator==
ainsi:
sign operator==(const std::string& lhs, const std::string& rhs);
Cela operator==
aurait traité la comparaison à trois voies à la fois, et pourrait toujours être utilisé pour effectuer le contrôle suivant tout en pouvant vérifier quelle chaîne est lexicographiquement supérieure à l'autre le cas échéant:
if (str1 == str2) { // Do something... }
Gestion des erreurs anciennes
Nous avons maintenant des exceptions, donc cette partie ne s’applique qu’aux anciennes langues où il n’en existait pas (C par exemple). Si nous regardons la bibliothèque standard de C (et celle de POSIX également), nous pouvons voir avec certitude que les fonctions maaaaany retournent en 0
cas de succès et que tout nombre entier sinon. J'ai malheureusement vu des gens faire ce genre de choses:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Si nous réfléchissons à notre façon de penser en programmation, nous avons souvent le schéma de raisonnement suivant:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Si nous y repenions, il aurait été logique de mettre la seule valeur neutre 0
, à yes
(et c'est ainsi que fonctionnent les fonctions de C), alors que toutes les autres valeurs peuvent être là pour résoudre les nombreux cas de la no
. Cependant, dans tous les langages de programmation que je connais (sauf peut - être quelques langues expérimentales ésotériques), qui yes
évalue à false
dans un if
état, alors que tous les no
cas à évaluer true
. Il existe de nombreuses situations où "ça marche" représente un cas alors que "ça ne marche pas" représente plusieurs causes probables. Si nous y réfléchissons de la sorte, avoir 0
évalué à true
et au reste false
aurait eu beaucoup plus de sens.
Conclusion
Ma conclusion est essentiellement ma question initiale: pourquoi avons-nous conçu les langages où 0
sont false
et sont les autres valeurs true
, en prenant en compte mes quelques exemples ci-dessus et peut-être d'autres que je n'ai pas pensé?
Suivi: Il est agréable de voir qu'il existe de nombreuses réponses avec de nombreuses idées et autant de raisons possibles pour que cela se produise. J'aime à quel point vous semblez passionné. Au départ, j’avais posé cette question par ennui, mais comme vous paraissiez si passionné, j’ai décidé d’aller un peu plus loin et de demander pourquoi le choix booléen pour 0 et 1 sur Math.SE :)
if true ; then ... ; fi
: où true
est une commande qui renvoie zéro et qui demande if
à être exécutée ...
.
bool
strcmp()
n’est pas un bon exemple pour true ou false, car il renvoie 3 valeurs différentes. Et vous serez surpris lorsque vous commencerez à utiliser un shell, où 0 signifie vrai et tout le reste faux.