11
votes

Quelle est la différence entre si (Const == variable) ou if (variable == const)?

Y a-t-il une différence dans l'ordre de l'opérateur de comparaison?

#define CONST_VALUE 5

int variable;

...

if ( variable == CONST_VALUE )   // Method 1
...

OR

if ( CONST_VALUE == variable )   // Method 2
...

c

5 Réponses :


31
votes

La raison que certaines personnes utilisent la méthode 2 est que vous obtiendrez une erreur de compilateur si vous en erreur a = à la place du ==.

Cependant, vous aurez des gens (comme moi) qui utiliseront toujours la méthode 1 car ils le trouvent plus lisibles et s'il y a une erreur, il sera détecté lors des tests (ou, dans certains cas, une analyse statique du code).


11 commentaires

Dis-moi, as-tu déjà fait cette erreur n'importe où où l'écrivait de cette façon l'aurait attrapé? Je l'écris "Méthode 1" car il est plus lisible, et je suis sûr que j'ai jamais écrit = au lieu de == en 25 ans d'écriture de langues C et C-litres.


Cela m'est arrivé dans le passé. Considérez-vous de la chance.


@Paul Tomblin: Au moins trois occasions au fil des ans, j'ai fixé des bugs de longue date d'avoir une affectation dans une déclaration IF (ou ÂT) où une comparaison était destinée. Cela dit, je devrais également indiquer que certains compilateurs (GCC en particulier) peuvent / donneront un avertissement si elle contient seulement une affectation (pas de comparaison), sauf si elle est contenue dans un ensemble de parenthèses supplémentaires. Mettre le costinant d'abord est garanti de travailler avec tous les compilateurs cependant.


Paul: Non, je ne l'écris pas de cette façon simplement parce que je suis convaincu que si je devais faire une erreur = /=, je le trouverais pendant une analyse ou des tests statiques. Cependant, la première phrase est l'argument selon lequel les personnes qui l'écrivent l'autre moyen font.


@Paul: J'ai commis l'erreur une ou deux fois auparavant, mais c'est souvent facile à attraper. Et l'avertissement du compilateur est le raisonnement est stupide car si vous vous souvenez d'utiliser 3 == var , vous vous souviendrez de vérifier les fautes de frappe.


La chèvre monte à peu près je pense. Si vous vous souvenez de faire la constante, il est tout aussi difficile (lu: pas du tout) à faire ==.


@Goat, Gman: Pas pour moi. J'écris la forme de lvalue constante par habitude et je pensais que c'est rare, le compilateur m'a attrapé de temps en temps.


@Paul - Je fais cette erreur plus souvent que je voudrais admettre; Chaque fois que je maudis mes mauvais compétences en dactylographie et que le fait que C ++ ne se comporte pas comme C # dans cette situation. Cependant, je déteste la manière dont la méthode 2 se lit et j'utilise toujours habituellement la méthode 1, même si de temps en temps, je suis un peu dans le cul. Et cela ne compte pas le temps où, comme Jerry Coffin, je rencontre un bug lié à cette question qui n'était même pas typée par moi.


@Gman: Cela signifie que le mode const == var n'est pas quelque chose que vous devez vous rappeler, une fois que vous avez appris l'habitude. Vous venez de le faire. En outre, ce n'est pas quelque chose que vous pouvez faire de mal par accident, comme le = / == distinction.


Si vous pouvez avoir l'habitude d'inversion de la commande, vous pouvez vous habituer à l'habitude de vérifier votre dactylographie.


@Disgruntledgoat a accepté! Et le point est que si on est capable de rappeler d'écrire constante chez LHS, il doit également être capable de rappeler d'écrire == correctement au lieu de = ...



10
votes

La seule différence est que (Const_Value == variable) rend la typographie commune (const_value = variable) impossible à compiler.

par comparaison, si (variable = const_value) entraînera la pensée du compilateur que vous vouliez affecter const_value à "variable".

La confusion = / == est une source assez courante de bugs en C, c'est pourquoi les gens essaient de contourner le problème avec des conventions de codage.

Bien sûr, cela ne vous sauvera pas si vous comparez deux variables.

Et la question semble être un duplicata de Comment vérifier les égaux? (0 == i) ou (i == 0)

Et voici quelques informations supplémentaires: http://cwe.mitre.org/data /definitions/481.html


0 commentaires

3
votes

Comme d'autres personnes mentionnées, Const_Value == variable évite la typo.

Je fais toujours "variable == const_value", car je pense que c'est plus lisible et quand je vois quelque chose comme: xxx

Ma sanglitpressure monte.


1 commentaires

J'utilise si (const_value == variable) , mais si je vois si (false == quelqueevariable) , ma tension artérielle souffre aussi. (C'est parce que cela devrait être si (! Quelqueevariable) bien sûr.)



2
votes

La première variante xxx

est meilleure, car il est plus lisible. Il suit la convention (également utilisée en mathématiques) que la valeur qui change la plupart vient en premier.

La deuxième variante xxx

est utilisée par certaines personnes à Empêcher un mélange de vérification de l'égalité avec l'affectation xxx

Il existe de meilleurs moyens de réaliser cela, par exemple permettant et prenant attention aux avertissements du compilateur.


0 commentaires

1
votes

D'autres ont déjà souligné la raison. = / == confusion. Je préfère la première version car il suit le processus de pensée plus étroitement. Certains compilateurs atténuent la confusion de = et == en donnant un avertissement lorsqu'il rencontre quelque chose comme xxx

dans ce cas si vous vouliez vraiment faire la cession que vous avez obligée d'écrire xxx

que j'écrirais alors comme xxx

pour éviter la confusion.

Ceci dit, nous avions Dans notre cas 1 cas où nous avions une confusion = / == et l'écriture, l'autre côté n'aurait pas permis de comparer entre Vars.


1 commentaires

Dans GCC cette option est -wperentheses