Question

J'ai un collègue qui soutient que VRAI était défini sur 0 et que toutes les autres valeurs étaient FAUX. Je pourrais jurer que chaque langue avec laquelle j'ai travaillé, si vous pouviez même obtenir une valeur pour un booléen, que la valeur pour FAUX est 0. Est-ce que TRUE était 0? Si oui, quand avons-nous changé?

Était-ce utile?

La solution

La chose 0 / non-0 qui confond votre collègue est confondue fait probablement référence à lorsque des personnes utilisent des valeurs numériques comme valeur de retour indiquant succès, et non la vérité (c'est-à-dire dans les scripts bash et certains styles de C / C ++).

L'utilisation de 0 = succès permet de spécifier beaucoup plus précisément les causes d'échec (par exemple, 1 = fichier manquant, 2 = membre manquant, etc.).

Remarque: en Ruby, les seules valeurs fausses sont nil et false. 0 est vrai, mais pas comme opposé aux autres nombres. 0 est vrai parce que c'est une instance de l'objet 0.

Autres conseils

Il peut s'agir d'un code de résultat de 0 qui, dans la plupart des cas, après l'exécution d'un processus, signifiait un code de résultat de 0, & "Hey, tout a bien fonctionné, aucun problème ici. &" ;

J'ai travaillé dans une entreprise avec une grande quantité de code C ancien. Certains en-têtes partagés définissaient leurs propres valeurs pour VRAI et FAUX, et certains avaient en effet VRAI à 0 et FAUX à 1. Cela entraînait des & "Guerres de la vérité &";

.
/* like my constants better */
#undef TRUE
#define TRUE 1

#undef FALSE
#define FALSE 0

Si rien d'autre, les shells bash utilisent toujours 0 pour vrai et 1 pour faux.

Plusieurs fonctions de la bibliothèque standard C renvoient un entier 'code d'erreur' comme résultat. Puisque noErr est défini sur 0, une vérification rapide peut être "si c'est 0, c'est ok". La même convention a été appliquée à un processus Unix '' code de résultat ''; c’est-à-dire un entier qui donne une certaine information sur la façon dont un processus donné se termine.

Dans les scripts de shell Unix, le code de résultat d’une commande qui vient d’être exécutée est disponible et est généralement utilisé pour indiquer si la commande 'a réussi' ou non, 0 signifiant succès et tout ce qui concerne une condition de non succès spécifique.

À partir de là, toutes les constructions de type test utilisées dans les scripts de shell utilisent "success" (c'est-à-dire un code de résultat égal à 0) pour signifier VRAI et tout le reste pour signifier FAUX.

Sur un plan totalement différent, les circuits numériques utilisent fréquemment la "logique négative". c'est-à-dire que même si 0 volt est appelé «0 binaire» et qu'une valeur positive (généralement + 5v ou + 3,3v, mais de nos jours il n'est pas rare d'utiliser + 1.8v) est appelée «1 binaire», certains événements sont «affirmés». par une broche donnée allant à 0. Je pense qu'il existe des avantages anti-bruit, mais je ne suis pas sûr des raisons.

Notez cependant qu’il n’ya rien d’ancien ou d’autre «temps de changement» à ce sujet. Tout ce que je sais à ce sujet est basé sur d’anciennes conventions, mais est totalement actuel et pertinent aujourd’hui.

Je ne suis pas certain, mais je peux vous dire ceci: les astuces basées sur la nature sous-jacente de TRUE et FALSE sont sujettes aux erreurs, car la définition de ces valeurs est laissée à l'implémenteur du langage (ou à tout le moins, le spécificateur).

Les appels système de la bibliothèque standard C renvoient généralement -1 en cas d'erreur et 0 en cas de succès. De plus, l’instruction calculée par Fotran si (et probablement probablement toujours) sautera à l’un des trois numéros de ligne, en fonction de la condition considérée comme inférieure à, égale ou supérieure à zéro.

Exemple: IF (I-15) 10,20,10

vérifiera si I == 15 passe à la ligne 20 si la valeur est vraie (la valeur est zéro) et à la ligne 10 sinon.

Sam a raison sur les problèmes liés à la connaissance spécifique des détails de la mise en œuvre.

Règle générale:

  1. Les shells (DOS inclus) utilisent & "; 0 &"; comme " Non Erreur & Quot; ... pas nécessairement vrai.

  2. Les langages de programmation utilisent des valeurs non nulles pour indiquer vrai.

Cela dit, si vous utilisez un langage qui vous permet de définir VRAI de FAUX, définissez-le et utilisez toujours les constantes.

Même aujourd’hui, dans certaines langues (Ruby, Lisp, ...), 0 est vrai, car tout sauf Nil est vrai. Plus souvent, 1 est vrai. C'est un piège courant et il est donc parfois considéré comme une bonne pratique de ne pas compter sur 0 comme faux, mais de faire un test explicite. Java vous oblige à le faire.

Au lieu de cela

int x;    
....
x = 0;
if (x)  // might be ambiguous
{
}

Make est explicite

if (0 != x)
{
}

Je me souviens d’avoir fait de la programmation VB dans un formulaire d’accès où True était -1.

Je me souviens que PL / 1 n’avait pas de classe booléenne. Vous pouvez créer un bit et lui attribuer le résultat d'une expression booléenne. Ensuite, pour l'utiliser, vous devez vous rappeler que 1 est faux et 0 est vrai.

Pour la plupart, false est défini sur 0 et true est différent de zéro. Certains langages de programmation utilisent 1, d’autres -1, et d’autres valeurs non nulles.

Cependant, pour les shells Unix, ils utilisent la convention opposée.

La plupart des commandes qui s'exécutent dans un shell Unix sont en fait de petits programmes. Ils renvoient un code de sortie afin que vous puissiez déterminer si la commande a abouti (valeur 0) ou si elle a échoué pour une raison quelconque (1 ou plus, en fonction du type d'échec).

Ceci est utilisé dans les interpréteurs de shell sh / ksh / bash dans les commandes if / while / Until pour vérifier les conditions:

if command
then
   # successful
fi

Si la commande aboutit (c'est-à-dire si elle renvoie un code de sortie nul), le code contenu dans l'instruction est exécuté. En général, la commande utilisée est la commande [, qui est un alias de la commande test.

Ce qui est amusant, c’est que cela dépend de la langue avec laquelle vous travaillez. Lua est true == interne pour les performances. Idem pour de nombreux appels système dans C.

Il est facile d’être dérouté lorsque les déclarations de retour vrai / faux de bash sont inversées:

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

J'ai entendu parler et utilisé d'anciens compilateurs où true > 0 et false & Lt; = 0.

C’est une des raisons pour lesquelles vous ne souhaitez pas utiliser if (pointeur) ou si (nombre) pour vérifier la valeur de zéro, ils pourraient être évalués à faux de manière inattendue.

De même, j'ai travaillé sur des systèmes où NULL n'était pas nul.

En langage C, avant C ++, il n’existait pas de booléen. Les conditions ont été effectuées en testant les ints. Zéro voulait dire faux et tout non nul voulait dire vrai. Pour que vous puissiez écrire

if (2) {
  alwaysDoThis();
} else {
  neverDothis();
}

Heureusement, C ++ a autorisé l'utilisation d'un type booléen dédié.

Dans toutes les langues dans lesquelles j'ai travaillé (remontant à BASIC à la fin des années 70), false a été considéré comme 0 et true a été différent de zéro.

Je ne me rappelle pas TRUE avoir été 0. 1 est quelque chose qu'un programmeur C retournerait pour indiquer le succès, cependant. Cela peut être confondu avec -1.

Ce n'est pas toujours <=> non plus. Cela peut être <=> ou simplement non nul.

Pour les langues sans type booléen intégré, la seule convention que j'ai vue consiste à définir TRUE sur 1 et FALSE sur 0. Par exemple, en C, l'instruction if exécutera la clause if si l'expression conditionnelle évalue autre chose que 0.

J'ai même vu un jour un document sur les directives de codage qui spécifiait de ne pas redéfinir VRAI et FAUX. :)

Si vous utilisez un langage avec un booléen intégré, tel que C ++, les mots clés true et false font partie du langage et vous ne devez pas vous fier à la manière dont ils sont réellement implémentés.

Dans les langues comme C, il n'y avait pas de valeur booléenne, vous deviez donc définir la vôtre. Auraient-ils pu travailler sur des substitutions BOOL non standard?

Les codes DOS et de sortie des applications utilisent généralement 0 pour indiquer un succès et non nul pour désigner un type de défaillance!

Les codes d’erreur DOS sont compris entre 0 et 255 et, lorsqu’ils ont été testés avec la syntaxe 'errorlevel', signifient tout ce qui se trouve au-dessus ou y compris la valeur spécifiée. Par conséquent, les correspondances suivantes correspondent à 2 et plus au premier, à 1 et au 0 (succès) à le dernier!

IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR

Le moteur de base de données SQL Server optimise le stockage des colonnes de bits. S'il existe une colonne de 8 bits ou moins dans une table, les colonnes sont stockées sous la forme d'un octet. Si le nombre de colonnes est compris entre 9 et 16 bits, elles sont stockées sous la forme de 2 octets, etc. Les valeurs de chaîne TRUE et FALSE peuvent être converties en valeurs de bits: TRUE est converti en 1 et FALSE en 0. La conversion en bits favorise la valeur 1 pour toute valeur non nulle.

Chaque langue peut avoir 0 comme vrai ou faux Alors arrêtez d'utiliser des nombres avec des mots vrais Lol Ou t et f 1 octet de stockage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top