Сравняване на дълго дълго с 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