2010-09-21 7 views
13

Lorsque vous comparez un type supérieur à int, avec une constante entière, devrais-je placer la constante à gauche ou à droite pour assurer la comparaison correcte?Yoda Conditions et promotion des nombres entiers

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

ou doit-il être:

if (-1 == i) 

Y at-il des circonstances dans lesquelles les deux cas n'est pas identique à la comparaison avec -1LL (où int64_t est long long)?

+5

yoda était une grande étiquette :) –

+4

un grand tag Yoda était :-) –

Répondre

11

Peu importe si vous le placez du côté droit ou du côté gauche; l'opérateur == est complètement symétrique.

Si les deux opérandes de l'opérateur == ont un type arithmétique, comme dans ce cas, alors les "conversions arithmétiques usuelles" sont appliquées (C99 §6.5.9). Dans ce cas, la règle applicable est:

Si les deux opérandes ont signé types entiers ou les deux ont unsigned types entiers, l'opérande avec le type de rang de conversion inférieur entier est converti au type de l'opérateur avec un plus grand rang. (C99 §6.3.1.8)

Donc le -1 est converti en int64_t. -1LL ne fait aucune différence.

+0

Fantastique, exactement ce que je voulais savoir. –

+15

En plus de la réponse: La raison habituelle de mettre la constante en premier est d'aider à attraper les fautes de frappe: Si vous avez tapé '==' comme '=', alors le compilateur se plaindra que vous ne pouvez pas assigner une constante. Dans l'autre sens (constante sur le côté droit), une plainte du compilateur n'est pas garantie. –

Questions connexes