2009-10-26 17 views
11

¿Hay alguna diferencia en el orden del operador de comparación?¿Cuál es la diferencia entre if (CONST == variable) o if (variable == CONST)?

#define CONST_VALUE 5 

int variable; 

... 

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

OR 

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

se trata simplemente de una cuestión de preferencia o existe una razón de peso para una orden de comparación en particular?

+0

ver http://stackoverflow.com/questions/283205/what-was-the-most-dangerous-programming-mistake-you-have-made-in-c/283212#283212 –

+0

Relevante: [https://en.wikipedia.org/wiki/Yoda_conditions](https://en.wikipedia.org/wiki/Yoda_conditions) – Boann

Respuesta

31

La razón por la que algunas personas usan el método 2 es porque obtendrá un error de compilación si se escribe incorrectamente a = en lugar del ==.

Sin embargo, tendrá personas (como yo) que seguirán usando el método 1 porque lo encuentran más legible y si hay un error, se detectará durante la prueba (o, en algunos casos, el análisis estático de el código).

+11

Dime, ¿alguna vez, jamás se ha hecho este error en cualquier lugar donde escribir de esta manera habría cogido? Lo escribo "método 1" porque es más fácil de leer, y estoy bastante seguro de que * nunca * he escrito = en lugar de == en 25 años de escribir los idiomas C y C. –

+5

Me pasó en el pasado. Considérate afortunado. –

+3

@Paul Tomblin: en al menos tres ocasiones a lo largo de los años he solucionado los errores de larga data de tener una asignación en una declaración if (o while) donde se pretendía una comparación. Dicho esto, también debo señalar que algunos compiladores (en particular, gcc) pueden/darán una advertencia si contienen * solo * una tarea (sin comparación), a menos que esté contenida en un conjunto adicional de paréntesis. Sin embargo, está garantizado que el primero funcione con todos los compiladores. –

10

La única diferencia es que (CONST_VALUE == variable) hace que el typo común (CONST_VALUE = variable) imposible compilar.

En comparación, si (variable = CONST_VALUE) dará lugar a que el compilador pensar que quería decir para asignar CONST_VALUE a 'variable'.

La =/== confusión es una fuente muy común de errores en C, por lo que las personas están tratando de evitar el problema con las convenciones de codificación.

Por supuesto, esto no va a ahorrar si usted está comparando dos variables.

Y la pregunta parece ser un duplicado de How to check for equals? (0 == i) or (i == 0)

Y aquí es algo más de información: http://cwe.mitre.org/data/definitions/481.html

3

Como han mencionado otros, CONST_VALUE == variables evita los = error tipográfico.

sigo haciendo "la variable == CONST_VALUE", porque creo que es más fácil de leer y cuando veo algo como:

if(false == somevariable) 

mi presión sanguínea sube.

+3

Yo uso 'if (CONST_VALUE == variable) ', pero si veo' if (false == somevariable) ', mi presión arterial también sufre. (Esto se debe a que debe ser 'if (! Somevariable)' por supuesto) – sbi

+1

+1 para la presión arterial – GManNickG

2

La primera variante

if (variable == CONST_VALUE) 

es mejor, porque es más fácil de leer. Sigue la convención (también utilizada en matemáticas) de que el valor que cambia más viene primero.

La segunda variante

if (CONST_VALUE == variable) 

es utilizado por algunas personas para evitar una confusión de la igualdad de comprobar con la asignación

if (CONST_VALUE = variable) 

Hay mejores maneras de lograr que, por ejemplo propicios y poniendo atención de las advertencias del compilador

1

Otros ya señalaron la razón. =/== confusión. Prefiero la primera versión porque sigue más de cerca el proceso de pensamiento.Algunos compilador aliviar la confusión de = y == dando una advertencia cuando encuentra algo así como

if(a=b) 

en este caso, si realmente quería hacer la asignación se ve obligado a escribir

if((a=b)) 

que escribiría entonces como

if((a=b) != 0) 

para evitar la confusión.

Dicho esto, teníamos en nuestro código 1 caso donde teníamos una confusión =/== y escribirlo al revés no habría ayudado ya que era una comparación entre vars.

+0

En GCC esa opción es -Wparentheses – Adisak

Cuestiones relacionadas