Cette question peut sembler stupide, mais pourquoi 0évalue-t-elle falseet toute autre valeur [entière] trueest 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 trueet 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 strcmpcomme 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 strcmpreturn, 0qui évalue à falsequand 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 trueplace, 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 -1et 1n'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, 0et 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::stringbien (bon, il y a déjà une comparefonction, 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 0cas 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 à falsedans un ifétat, alors que tous les nocas à é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é à trueet au reste falseaurait eu beaucoup plus de sens.
Conclusion
Ma conclusion est essentiellement ma question initiale: pourquoi avons-nous conçu les langages où 0sont falseet 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ù trueest 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.