Йода Условия и целочисленное продвижение - PullRequest
13 голосов
/ 21 сентября 2010

При сравнении типа, большего чем int, с целочисленной константой, должен ли я поместить константу слева или справа, чтобы убедиться в правильности сравнения?

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

или это должно быть:

if (-1 == i)

Существуют ли обстоятельства, при которых любой из этих случаев не идентичен сравнению с -1LL (где int64_t равно long long)?

1 Ответ

11 голосов
/ 21 сентября 2010

Неважно, положите ли вы его справа или слева; оператор == полностью симметричен.

Если оба операнда оператора == имеют арифметический тип, как в этом случае, то применяются «обычные арифметические преобразования» (C99 §6.5.9). В этом случае применяется следующее правило:

Если оба операнда имеют целочисленные типы со знаком или оба без знака целочисленные типы, операнд с типом меньшего целого ранга преобразования преобразован в тип операнда с большим рангом. (C99 §6.3.1.8)

Таким образом, -1 преобразуется в int64_t. -1LL не имеет значения.

...