2010-09-21 15 views
13

Quando si confronta un tipo più grande di int, con una costante intera, dovrei posizionare la costante a sinistra oa destra per garantire che venga eseguito il confronto corretto?Yoda Condizioni e promozione intera

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

o dovrebbe essere:

if (-1 == i) 

Ci sono circostanze in cui entrambi i casi non è identico a confronto con -1LL (dove int64_t è long long)?

+5

yoda era un tag fantastico :) –

+4

un tag grande Yoda era :-) –

risposta

11

Non importa se lo si mette sul lato destro o sul lato sinistro; l'operatore == è completamente simmetrico.

Se entrambi gli operandi all'operatore == hanno tipo aritmetico, come in questo caso, vengono applicate le "normali conversioni aritmetiche" (C99 §6.5.9). In questo caso, la regola che vale è:

Se entrambi gli operandi hanno firmato tipi interi o entrambi sono unsigned tipi interi, l'operando con il tipo di minore rango conversione intero è convertito al tipo dell'operando con maggiore rango. (C99 §6.3.1.8)

Quindi il -1 viene convertito in int64_t. -1LL non fa differenza.

+0

Fantastico, esattamente quello che volevo sapere. –

+15

In aggiunta alla risposta: il solito motivo per cui la costante è la prima consiste nell'aiutare a catturare errori di battitura: se si digita '==' come '=', il compilatore si lamenterà che non è possibile assegnare a una costante. Al contrario (costante sul lato destro), non è garantito un reclamo da parte del compilatore. –