156 votes

Y a-t-il une différence entre OUI/NON, VRAI/FAUX et vrai/faux dans objective-c ?

Une question simple : y a-t-il une différence entre ces valeurs (et y a-t-il une différence entre BOOL et bool) ? Un collègue m'a dit qu'ils étaient évalués différemment en Objective-C, mais lorsque j'ai regardé les typologies dans leurs fichiers .h respectifs, YES/TRUE/true étaient tous définis comme suit 1 et NON/FALSE/faux ont tous été définis comme suit 0 . Y a-t-il vraiment une différence ?

5 votes

D'un point de vue pratique, il n'y a aucune différence. Vous pouvez probablement faire diverses astuces pour démontrer une différence, mais vous vous égareriez généralement dans le territoire des "comportements non définis".

0 votes

À ce sujet, je vous recommande de vérifier ma question intéressante : stackoverflow.com/q/65517700/5492956 Vous pouvez voir qu'il y a des nuances de YES y true .

101voto

Dan J Points 7314

Je crois qu'il y a est une différence entre bool y BOOL consultez cette page web pour savoir pourquoi :
http://iosdevelopertips.com/objective-c/of-bool-and-yes.html

Parce que BOOL est un unsigned char plutôt qu'un type primitif, les variables de type BOOL peut contenir des valeurs autres que YES y NO .

Considérez ce code :

BOOL b = 42;

if (b) {
    printf("b is not NO!\n");
}

if (b != YES) {
    printf("b is not YES!\n");
}

La sortie est :

b n'est pas NON !
b n'est pas OUI !

Pour la plupart des gens, il s'agit d'une préoccupation inutile, mais si vous voulez vraiment un booléen, il est préférable d'utiliser un fichier de type bool . Je dois ajouter que le SDK iOS utilise généralement BOOL sur ses définitions d'interface, ce qui constitue un argument en faveur de l'utilisation de l'option BOOL .

5 votes

Mais notez que l'implémentation originale en C n'avait pas bool La tradition veut donc que l'on utilise une carte d'identité de l'entreprise. int ou char comme un booléen, parfois avec un #define pour cacher la différence et parfois non. En fait, je ne suis pas sûr que même les normes actuelles requièrent bool d'être mis en œuvre d'une manière qui empêche l'examen de sa structure interne.

1 votes

Bien que, le premier printf raconte des mensonges. La valeur de b n'est pas YES il est "différent de zéro", ce qui est ce que la condition teste. Vous devriez donc avoir printf("b is not zero") ce qui n'est pas nécessairement la même chose que YES . Dans ce cas, b est à la fois "non nul" et "non OUI".

0 votes

Merci Lawrence, j'ai fait une mise à jour dans ce sens.

84voto

Lawrence Dol Points 27976

Il n'y a pas de différence pratique fourni par vous utilisez BOOL comme des booléens. Le C traite les expressions booléennes selon qu'elles valent 0 ou pas 0. Ainsi :

if(someVar ) { ... }
if(!someVar) { ... }

signifie la même chose que

if(someVar!=0) { ... }
if(someVar==0) { ... }

C'est pourquoi vous pouvez évaluer n'importe quel type primitif ou expression comme un test booléen (y compris, par exemple, les pointeurs). Notez que vous devriez faire le premier test, et non le second.

Notez qu'il y a est une différence si vous attribuez des valeurs obtuses à une soi-disant BOOL et testent des valeurs spécifiques. Par conséquent, il faut toujours les utiliser comme des booléens et ne les affecter qu'à partir de leur #define valeurs.

Il est important de ne jamais tester les booléens à l'aide d'une comparaison de caractères - c'est non seulement risqué car someVar pourrait se voir attribuer une valeur non nulle, ce qui n'est pas OUI, mais, à mon avis plus important, cela n'exprime pas correctement l'intention :

if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!

En d'autres termes, utilisez les constructions comme elles sont prévues et documentées pour être utilisées et vous vous épargnerez un monde de souffrance en C.

55voto

Supuhstar Points 2310

J'ai fait un test exhaustif à ce sujet. Mes résultats devraient parler d'eux-mêmes :

//These will all print "1"
NSLog(@"%d", true == true);
NSLog(@"%d", TRUE == true);
NSLog(@"%d", YES  == true);
NSLog(@"%d", true == TRUE);
NSLog(@"%d", TRUE == TRUE);
NSLog(@"%d", YES  == TRUE);
NSLog(@"%d", true == YES);
NSLog(@"%d", TRUE == YES);
NSLog(@"%d", YES  == YES);

NSLog(@"%d", false == false);
NSLog(@"%d", FALSE == false);
NSLog(@"%d", NO    == false);
NSLog(@"%d", false == FALSE);
NSLog(@"%d", FALSE == FALSE);
NSLog(@"%d", NO    == FALSE);
NSLog(@"%d", false == NO);
NSLog(@"%d", FALSE == NO);
NSLog(@"%d", NO    == NO);

//These will all print "0"
NSLog(@"%d", false == true);
NSLog(@"%d", FALSE == true);
NSLog(@"%d", NO    == true);
NSLog(@"%d", false == TRUE);
NSLog(@"%d", FALSE == TRUE);
NSLog(@"%d", NO    == TRUE);
NSLog(@"%d", false == YES);
NSLog(@"%d", FALSE == YES);
NSLog(@"%d", NO    == YES);

NSLog(@"%d", true == false);
NSLog(@"%d", TRUE == false);
NSLog(@"%d", YES  == false);
NSLog(@"%d", true == FALSE);
NSLog(@"%d", TRUE == FALSE);
NSLog(@"%d", YES  == FALSE);
NSLog(@"%d", true == NO);
NSLog(@"%d", TRUE == NO);
NSLog(@"%d", YES  == NO);

La sortie est :

2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.072 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.076 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.082 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.091 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.092 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.097 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.098 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.101 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0

3 votes

[[NSObject]alloc]init] n'est pas égal à VRAI ou à OUI. Donc tester l'initialisation d'un objet avec if ([[NSObject]alloc]init]==TRUE) échouera. Je n'ai jamais été à l'aise avec un langage définissant une valeur singulière "vraie" alors qu'en fait n'importe quelle valeur non nulle fera l'affaire.

4 votes

@SamuelRenkert Je n'ai jamais été à l'aise avec un langage prenant une valeur non booléenne dans un if ou un while . Comme... while("guitar gently weeps") ne devrait pas fonctionner...

1 votes

@SamuelRenkert aussi la backdoor Linux qui a été trouvé en 2003 : if (user_id = ROOT_UID)

14voto

Barry Wark Points 73462

Vous pourriez vouloir lire les réponses à cette question question . En résumé, en Objective-C (d'après la définition dans objc.h) :

typedef signed char        BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED

#define YES             (BOOL)1
#define NO              (BOOL)0

0voto

Marco Points 494

Je pense qu'ils ajoutent OUI/NON pour être plus explicites dans de nombreux cas. Par exemple :

[button setHidden:YES];

est meilleur que

[button setHidden:TRUE];

2 votes

Je ne suis pas d'accord ; les deux se lisent de la même façon, pour moi. Cependant, dans une interface utilisateur destinée à un profane, je pense que Oui/Non est plus joli.

17 votes

Je ne suis pas d'accord non plus. Si la lecture est mauvaise, c'est parce que l'on ne respecte pas les normes non écrites qui sont utilisées depuis des années dans d'autres langues. L'IE est un excellent exemple de ce qui se passe lorsque l'on n'adhère pas à un grand nombre de normes.

1 votes

Une moitié de downvote pour 2 réponses imprécises et une moitié de downvote pour signer vos réponses

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X