2010-09-21 16 views
13

Al comparar un tipo más grande que int, con una constante entera, ¿debo colocar la constante a la izquierda o derecha para asegurar que se realiza la comparación correcta?Yoda Condiciones y promoción de enteros

int64_t i = some_val; 
if (i == -1) 

o debe ser:

if (-1 == i) 

¿Hay alguna circunstancia en la que cualquiera de los casos no es idéntica a la comparación con -1LL (donde int64_t es long long)?

+5

yoda era una gran etiqueta :) –

+4

una gran etiqueta Yoda era :-) –

Respuesta

11

No importa si lo coloca en el lado derecho o izquierdo; el operador == es completamente simétrico.

Si los dos operandos del operador == tienen un tipo aritmético, como en este caso, se aplican las "conversiones aritméticas habituales" (C99 §6.5.9). En este caso, la regla que se aplica es:

Si ambos operandos han firmado tipos de enteros o ambos han unsigned tipos de enteros, el operando con el tipo de rango de conversión de número entero menor se convertida al tipo del operando con mayor rango (C99 §6.3.1.8)

Entonces el -1 se convierte en int64_t. -1LL no hace la diferencia.

+0

Fantástico, exactamente lo que quería saber. –

+15

Además de la respuesta: la razón habitual para poner la constante primero es ayudar a detectar errores tipográficos: si escribiste '==' como '=', el compilador se quejará de que no puedes asignar una constante. A la inversa (constante en el lado derecho), no se garantiza una queja del compilador. –