Lorsque je souhaite vérifier si une valeur est 0 code> en C, comment est-ce fait idiomatiquement? p>
si (! num) code> li>
si (num == 0) code> li>
ul>
8 Réponses :
Je préfère toujours la deuxième façon: comme Le pire exemple de ce serait: p> qui déguise vraiment sa Intention comme le Toutefois si le mais cela peut être fait Documentation automatique en créant un type personnalisé: p> num == 0 code> ou
ptr == null code> est évalué à un booléen qui est l'intention. Le compilateur Java applique ce formulaire, mais les compilateurs C / C ++ ne le font pas. P>
STRCMP CODE> La famille de fonctions ne retourne pas booléen, ils retournent positive, zéro ou négatif (comme indiqué par @jooMimpileborg). P>
INT code> est utilisé pour représenter un type booléen, lequel c n'a pas de type intégré pour, alors ce formulaire est correct: p>
STRCMP code> est un bon exemple. J'aime ça dans Objective-C, Apple a fourni une énumération avec
nsordédascending code>,
nsordedsame code> et
nsordeddescendants code> qui rend l'intention plus claire que -1, 0 et 1.
En ce qui concerne le cas STRCMP code>, la valeur de retour peut en réalité être une valeur positive ou négative, outre zéro. Ne comparez jamais contre
1 code> ou
-1 code>.
@ Joachimpileborg: convenu; Vous utiliseriez <0 code>,
== 0 code> ou
> 0 code>.
Oh yuck! Non! "Comme NUM == 0 ou PTR == NULL, évalue à un booléen qui est l'intention. Le compilateur Java applique ce formulaire, mais les compilateurs C / C ++ ne le font pas." Cette question est étiquetée C. en C Ces opérations n'évaluent pas à un booléen. Ils évaluent à 0 ou 1, explicitement dans la spécification AN INT B> 0 ou 1.
@Jamesgreenhalgh: Préférez-vous quelque chose comme: Char * p = et quelque chose; Si (p) {...} code>?
@trojanfoe Je n'exprime aucune préférence pour les idiomes. J'exprime une préférence pour des déclarations précises sur le résultat des expressions. Les opérateurs d'égalité et de comparaison renvoient un int b> de valeur 0 ou 1. Cette distinction est importante dans C99, où l'évaluation de Boolean impliquerait un résultat de type _bool.
@Jamesgreenhalgh: intéressant; Je n'aurais même jamais entendu parler de _bool code> que seuls seuls l'utiliser. Vous vivez et apprenez :)
S'il s'agit d'une question de goût, je trouve que cela dépend à peu près de l'intention. Si la valeur doit être utilisée en tant que booléen, ! Code> va bien. Si la valeur compte quelque chose, l'égalité a plus de sens.
if (!isVisible) {...}
if (isVisible == 0) {...} // Intention not as clear as line above.
if (numberOfItems == 0) {...}
if (!numberOfItems) {...} // Intention not as clear as line above.
Je pense que cela dépend du contexte. Si la variable se réfère à une valeur booléenne est meilleure première fois. Sinon, la seconde est meilleure. P>
J'étais sur le point d'écrire exactement la même chose.
Je pense que nous avons tous écrit sur la même chose;)
C'est fait, mais vous voulez que ce soit fait, en termes de style. Je ne le vois pas aussi longtemps que votre cohérence et il est clair sur ce que vous essayez de faire, ou si vous le faites dans des cas où cela pourrait mieux couler dans une phrase anglaise et mettre l'accent sur ce que vous faites. p>
Pour des raisons de clarté, j'ai généralement si (num == 0) code>, car il faut moins de penser à comprendre ce que je fais quand je vais sur mon code. P>
Peu importe les autres que les autres vous ont dit avec une exception!
Ne le faites pas avec Exemple: http://ideone.com/piuffla p> avec une compilation non optimisée (Si vous activez des optimisations, le compilateur pourrait pré-calculer certaines valeurs dans une précision supérieure et les arrondir à float code> et
double code>. IEEE 754
float code> s /
double code> S /
LONG Double code> S (le plus couramment utilisé) souvent ne contient pas de valeurs exactes, donc les comparant directement avec
0 code> est stupide (ou faisant
si (! floatvalue) code>) p>
0 code>) P > p>
Mais cela n'a-t-il pas plus à voir avec 0,1 code> ne pas être représentable dans la base 2?
@Paul oui (et même 0.2 code> et
0.3 code>). Mais le "pourquoi" n'est pas vraiment pertinent. La chose importante était
"ne le fais pas avec flotteur un double" code>
La raison donnée est fausse. "Souvent ne contient pas de valeurs exactes" n'est pas vrai: les types de points flottants contiennent des valeurs exactes - mais le résultat d'un calcul peut ne pas être ce qu'une personne suppose naïvement. Si vous attribuez un "0" littéral à un flotteur, il se comparera toujours à celui de "0". et c'est la même chose pour -0 aussi que cela se compare comme égal à +0.
!! user code> fonctionnera également si vous souhaitez vérifier si la valeur n'est pas nulle. p>
! Valeur code> Évalue à 1 lorsque la valeur = 0 et 0 lorsque la valeur 0.
Le second ! Code> flipse, rendant
!
Et est même une astuce en C ++ Stackoverflow.com/questions/ 248693 / Double-négation-In-C-Code
@xanatos: Bien sûr, la question était à propos de C.
Nous pouvons discuter de quelle manière c'est mieux, mais idiomatique, bien que pour ce que je puisse dire par d'autres réponses archaic, serait si (! num) code>. p>.
Pour le compilateur, cela n'a pas d'importance, bien sûr. Pour le lecteur humain, il fait. Étant donné que les deux formes sont utilisées par d'autres êtres humains, vous devriez vous y habituer et les reconnaître. Personnellement, je préfère la forme la plus courte, qui prend moins de temps (moins de jetons, en particulier par la parenthèse) de lire et de comprendre. Surtout:
if (ptr != NULL) {} if (strcmp(a,b) == 0) {} of (0 == strcmp()) {}
Préférez
si (0 == num) code> Si vous devez choisir une seconde sur le premier.First est la meilleure option.
@Als
si (0 == num) code>, l'état classique Yoda
@DavidHeffernan: Q du choix personnel vraiment.Je préfère cela.