web-dev-qa-db-fra.com

1 = faux et 0 = vrai?

Je suis tombé sur une fonction is_equals () dans une API c au travail qui a retourné 1 pour les tables sql non égales (false) et 0 pour les tables égales (true). Je ne l'ai réalisé qu'après avoir exécuté des cas de test sur mon code, un pour l'exemple positif et un pour le négatif et ils ont tous les deux échoué, ce qui au début n'avait pas beaucoup de sens. Le code dans l'API n'a pas de bogue car la sortie a été enregistrée correctement dans sa documentation.

Mes questions - y a-t-il des mondes à l'envers/des univers parallèles/des langages de codage où ce NOT logique est normal? N'est-ce pas habituellement vrai? Le codeur de l'API fait-il une erreur?

24
Ben

Il est courant que les fonctions de comparaison renvoient 0 Sur "égal", afin qu'elles puissent également renvoyer un nombre négatif pour "inférieur à" et un nombre positif pour "supérieur à". strcmp() et memcmp() fonctionnent comme ceci.

Il est cependant idiomatique que zéro soit faux et différent de zéro, car c'est ainsi que fonctionnent le contrôle de flux C et les opérateurs booléens logiques. Il se peut donc que les valeurs de retour choisies pour cette fonction soient correctes, mais c'est la fonction nom qui est erronée (elle devrait vraiment juste être appelée compare() ou similaire).

35
caf

Ce monde à l'envers est courant avec les retours d'erreur de processus. La variable Shell $? signale la valeur de retour du programme précédent à exécuter à partir du shell, il est donc facile de dire si un programme réussit ou échoue:

$ false ; echo $?
1
$ true ; echo $?
0

Cela a été choisi car il existe un seul cas où un programme réussit mais il peut y avoir des dizaines de raisons pour lesquelles un programme échoue - en permettant qu'il y ait de nombreux codes d'erreur différents, un programme peut déterminer pourquoi un autre programme a échoué sans avoir à analyser la sortie.

Un exemple concret est le aa-status programme fourni avec l'outil AppArmorcontrôle d'accès obligatoire :

   Upon exiting, aa-status will set its return value to the
   following values:

   0   if apparmor is enabled and policy is loaded.

   1   if apparmor is not enabled/loaded.

   2   if apparmor is enabled but no policy is loaded.

   3   if the apparmor control files aren't available under
       /sys/kernel/security/.

   4   if the user running the script doesn't have enough
       privileges to read the apparmor control files.

(Je suis sûr qu'il existe des programmes plus répandus avec ce comportement, mais je le connais bien. :)

14
sarnold

Je soupçonne qu'il suit simplement le norme Linux/Unix pour retourne 0 en cas de succès .

Est-ce que dit vraiment "1" est faux et "0" est vrai?

5
Peter K.

Il n'y a pas de bonne raison pour 1 pour être vrai et 0 être faux; c'est comme ça que les choses ont toujours été notées. Donc, d'un point de vue logique, la fonction de votre API n'est pas "fausse" en soi.

Cela dit, il n'est normalement pas conseillé de travailler contre les idiomes du langage ou du framework que vous utilisez sans une sacrée bonne raison de le faire, donc celui qui a écrit cette fonction était probablement assez osé, en supposant ce n'est pas simplement un bug.

5
Brennan Vincent

Cela peut très bien être une erreur de la part de l'auteur original, cependant la notion que 1 est vrai et 0 est faux n'est pas un concept universel. Dans Shell, l'écriture de scripts 0 est renvoyée pour la réussite, et tout autre nombre pour l'échec. Dans d'autres langages tels que Ruby, seuls nil et false sont considérés comme faux, et toute autre valeur est considérée comme vraie, donc dans Ruby les deux 1 et 0 seraient considérés comme vrais.

3
Kelend

Je ne sais pas si je réponds correctement à la question, mais voici un exemple familier:

Le type de retour de GetLastError() dans Windows est différent de zéro s'il y a eu une erreur, ou zéro sinon. L'inverse est généralement vrai pour la valeur de retour de la fonction que vous avez appelée.

2
Mehrdad