Yoda Условия и целочисленное продвижение

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

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

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

if (-1 == i)

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


person Matt Joiner    schedule 21.09.2010    source источник
comment
отличный тэг Йода был :-)   -  person Josh Petitt    schedule 24.09.2012


Ответы (1)


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

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

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

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

person caf    schedule 21.09.2010
comment
Фантастика, именно то, что я хотел знать. - person Matt Joiner; 21.09.2010
comment
В дополнение к ответу: Обычной причиной размещения константы на первом месте является обнаружение опечаток: если вы неправильно напечатали == как =, компилятор будет жаловаться, что вы не можете назначить константу. Наоборот (константа справа) жалоба компилятора не гарантируется. - person Bart van Ingen Schenau; 21.09.2010