Сравнение long long с 0

long long llIdx = foo();
if (llIdx > 0LL) // Can I use 0 here?
  ...

Есть ли проблема, если я использую 0 вместо 0LL в приведенном выше коде?

Когда я должен предпочесть 0LL 0?


person Deqing    schedule 17.02.2015    source источник
comment
long long является типом signed. Не имеет значения, пишете ли вы x > 0ll или x > 0, потому что 0 автоматически повышается до long long.   -  person kay    schedule 17.02.2015
comment
stackoverflow.com/ вопросы/13275136/   -  person Alex Reynolds    schedule 17.02.2015
comment
На самом деле подписанность long long не имеет значения для этого конкретного случая. Если бы сравнение было llIdx >= 0 (или 0LL), оно было бы таковым, потому что этот предикат всегда был бы истинным для unsigned long long.   -  person kdopen    schedule 17.02.2015


Ответы (1)


Да, здесь можно использовать обычный 0. Компилятор просматривает тип каждого аргумента до > и продвигает меньший аргумент, чтобы они были одинакового размера.

Таким образом, llIdx > 0 и llIdx > 0LL эквивалентны.

person kdopen    schedule 17.02.2015
comment
Компилятор просматривает тип каждого аргумента до > и продвигает меньший аргумент, чтобы они были одинакового размера. Вот почему я не поставил свой комментарий в качестве ответа. Существует множество особых случаев, когда знак обоих целых чисел меняется. - person kay; 17.02.2015
comment
Не видел ваш комментарий, пока печатал :) Я просто пытался ответить на конкретный вопрос немного больше, чем да. И я полагаю, вы имели в виду подпись, а не подпись - person kdopen; 17.02.2015
comment
Итак, когда мы должны использовать 0LL вместо 0? - person Deqing; 17.02.2015
comment
@Deqing: я не могу привести хороший пример, когда обычное арифметическое преобразование делает что-то неожиданное, если один операнд имеет значение 0. Аргументы с переменным числом аргументов — это один (например, printf("%lld", 0LL);) и unsigned n; int i; ... long long l = 0LL + n + i; (если long long охватывает диапазон unsigned int, что, вероятно, всегда так, это предотвращает повышение уровня i до unsigned). - person mafso; 17.02.2015