2010-09-21 10 views
13

Porównując typ większy niż int, ze stałą całkowitą, należy ustawić stałą po lewej lub po prawej, aby zapewnić prawidłowe porównanie?Yoda Conditions and integer promotion

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

lub powinno być:

if (-1 == i) 

Czy istnieją okoliczności, w których albo sprawa nie jest identyczny do porównania z -1LL (gdzie int64_t jest long long)?

+5

Yoda była świetnym tagiem :) –

+4

świetny tag Yoda był :-) –

Odpowiedz

11

Nie ma znaczenia, czy umieścisz go po prawej stronie, czy po lewej stronie; Operator == jest całkowicie symetryczny.

Jeśli oba operandy dla operatora == mają typ arytmetyczny, tak jak w tym przypadku, wówczas stosowane są "zwykłe konwersje arytmetyczne" (C99 §6.5.9). W tym przypadku zasada, że ​​dotyczy to:

Jeśli oba operandy podpisali typy całkowite lub oba unsigned rodzajów liczbą całkowitą, argument z rodzaju mniejszej rangi konwersji całkowita jest przekształcany do typu argumentu z większą rangą. (C99 §6.3.1.8)

Więc -1 jest konwertowane na int64_t. -1LL nie ma znaczenia.

+0

Fantastyczny, dokładnie to, co chciałem wiedzieć. –

+15

Oprócz odpowiedzi: zwykłym powodem umieszczania stałej jako pierwszej jest pomoc w łapaniu literówek: Jeśli błędnie wpisano '==' jako '=', kompilator narzeka, że ​​nie można przypisać stałej. Na odwrót (stała po prawej stronie), skarga od kompilatora nie jest gwarantowana. –