каква е разликата между предупреждения C4018 („израз“: несъответствие със знак/неподписан) и C4389 („оператор“: несъответствие със знак/неподписан)

така че каква е разликата между C4018 ('expression' : signed/unsign mismatch) и C4389 ('operator': signed/unsign mismatch) предупреждения ?

unsigned int uc = 0;
int c = 0;
if (uc < c) uc = 0;   // C4018

vs

int a = 9;
unsigned int b = 10;
if (a == b)   // C4389

Просто не го разбирам.


person onqtam    schedule 13.09.2016    source източник


Отговори (1)


Най-голямата разлика е нивото на предупреждение, при което се генерират тези диагностични съобщения. C4018 е предупреждение от ниво 3. Попада в категорията "неща, които не трябва да пренебрегвате". Просто опитайте кода, който имате с uc = 1 и c = -1 и помислете как е възможно 1 да е по-малко от -1. Почти нито един програмист не очаква такъв резултат. Това го прави генератор на грешки и заслужава видима диагностика.

C4389 е предупреждение от ниво 4. Попада в категорията "изглежда грешно, но вероятно работи все пак". Знакът на операндите не влияе на сравнението на равенството.

Нивото на предупреждение по подразбиране е 3, освен ако не сте променили настройката на проекта. Това ви кара да виждате диагностиката „не трябва да се игнорира“, а не „вероятно все пак работи“.

person Hans Passant    schedule 14.09.2016