Question simple vraiment; 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 a mentionné qu'ils évaluaient à différentes choses dans Objective-C, mais quand j'ai regardé les typedefs dans leurs fichiers .h respectifs, YES / TRUE / true étaient tous définis comme 1
et NO / FALSE / false étaient tous définis comme 0
. Y a-t-il vraiment une différence?
objective-c
boolean
Kevlar
la source
la source
Réponses:
Il n'y a aucune différence pratique à condition d'utiliser des
BOOL
variables comme booléens. C traite les expressions booléennes selon qu'elles évaluent à 0 ou non à 0. Donc:signifie la même chose que
c'est pourquoi vous pouvez évaluer n'importe quel type ou expression primitive comme un test booléen (y compris, par exemple, des pointeurs). Notez que vous devriez faire le premier, pas le second.
Notez qu'il y a une différence si vous attribuez des valeurs à un obtus que l' on appelle
BOOL
variable et test pour des valeurs spécifiques, donc toujours les utiliser comme booléens et seulement les affecter de leurs#define
valeurs.Surtout, ne testez jamais les booléens en utilisant une comparaison de caractères - ce n'est pas seulement risqué car on
someVar
pourrait attribuer une valeur non nulle qui n'est pas OUI, mais, à mon avis plus important encore, cela ne parvient pas à exprimer correctement l'intention:En d'autres termes, utilisez des constructions telles qu'elles sont prévues et documentées pour être utilisées et vous vous épargnerez un monde de blessures en C.
la source
Je crois qu'il y a une différence entre
bool
etBOOL
, consultez cette page Web pour une explication de pourquoi:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Comme il
BOOL
s'agit d'un typeunsigned char
plutôt que primitif, les variables de typeBOOL
peuvent contenir des valeurs autres queYES
etNO
.Considérez ce code:
La sortie est:
Pour la plupart des gens, c'est une préoccupation inutile, mais si vous voulez vraiment un booléen, il est préférable d'utiliser un
bool
. Je devrais ajouter: le SDK iOS utilise généralementBOOL
sur ses définitions d'interface, c'est donc un argument avec lequel s'en tenirBOOL
.la source
bool
, et par conséquent, il était de tradition d'utiliser unint
ouchar
comme un booléen, parfois avec un #define pour masquer la différence et parfois pas. En fait, je ne sais pas si même les normes actuellesbool
doivent être mises en œuvre d'une manière qui empêche d'examiner sa structure interne.printf
raconte des mensonges. La valeur deb
n'est pasYES
, ce n'est pas zéro, ce que teste la condition. Donc, vous devriez avoirprintf("b is not zero")
, ce qui n'est pas nécessairement le même queYES
. Dans ce cas,b
est à la fois "différent de zéro" et "pas OUI".J'ai fait un test exhaustif à ce sujet. Mes résultats devraient parler d'eux-mêmes:
La sortie est:
la source
if
ou unwhile
. Comme ...while("guitar gently weeps")
ne devrait pas fonctionner ...if (user_id = ROOT_UID)
Vous voudrez peut-être lire les réponses à cette question . En résumé, en Objective-C (d'après la définition en objc.h):
la source
La principale différence (dangereuse!) Entre
true
etYES
réside dans la sérialisation JSON.Par exemple, nous avons une requête de serveur de type JSON et devons envoyer true / false dans json sens:
Ensuite, nous le convertissons en chaîne JSON avant de l'envoyer en tant que
Le résultat est
En raison de la logique de l'API,
jsonString1
une erreur peut survenir.Soyez donc prudent avec les booléens en Objective-C.
Pour résumer, seules les
@YES
valeurs exactes et castées@((BOOL)expression)
sont de__NSCFBoolean
type et converties entrue
sérialisation JSON. Toutes les autres expressions comme@(expression1 && expression2)
(paire@(YES && YES)
) sont de__NSCFNumber (int)
type et converties1
en JSON.PS Vous pouvez simplement utiliser un booléen à valeur chaîne
la source
Il y a un bug subtil que personne n'a mentionné ici, que je pensais inclure ... plus une erreur logique qu'autre chose:
donc le problème ici est juste cela
(YES==1)
et en C la comparaison n'est pas booléenne, mais basée sur la valeur.parce que
YES
c'est juste un#define
(plutôt que quelque chose d'intrinsèque à la langue), il doit avoir une certaine valeur, et1
cela a le plus de sens.la source
Je pense qu'ils ajoutent OUI / NON pour être plus explicites dans de nombreux cas. Par exemple:
sonne mieux que
la source
Examinons d'abord ce qu'est le vrai et le faux et ce qui leur donne un sens en premier lieu.
nous pouvons construire une structure appelée if a then b else c dans le calcul lambda comme suit:
En JavaScript, cela ressemble à ceci:
pour que ifThenElse soit utile, nous avons besoin d'une fonction "true" qui choisit soit la droite soit la gauche, et le fait en ignorant l'autre option, ou une fonction "false" qui choisit l'option "true" ne prend pas.
Nous pouvons définir ces fonctions comme suit:
en JavaScript, cela ressemble à ceci:
maintenant nous pouvons faire ce qui suit
avec doThis et doThat étant (\ a. ()) parce que le calcul lambda n'offre aucun service tel que l'impression / maths / chaînes, tout ce que nous pouvons faire est de ne rien faire et dire que nous l'avons fait (et plus tard tricher en le remplaçant par des services dans notre système qui fournit les effets secondaires que nous voulons)
alors voyons cela en action.
C'est un environnement profond qui pourrait être simplifié si nous étions autorisés à utiliser des tableaux / cartes / arguments / ou plus d'une instruction pour diviser en plusieurs fonctions, mais je veux garder c'est aussi pur que je peux me limiter aux fonctions d'exactement un argument seulement.
notez que le nom True / False n'a aucune signification inhérente, nous pouvons facilement les renommer en oui / non, gauche / droite, droite / gauche, zéro / un, pomme / orange. Cela a une signification en ce que quel que soit le choix qui est fait, il n'est causé que par le type de choix qui l'a fait. Donc, si "LEFT" est imprimé, nous savons que le sélecteur ne peut être que vrai, et sur la base de cette connaissance, nous pouvons guider nos décisions ultérieures.
Donc pour résumer
la source
Non, OUI / NON est une manière différente de se référer à TRUE / FALSE (1/0)
la source