в чем разница между предупреждениями C4018 («выражение»: несоответствие со знаком/без знака) и C4389 («оператор»: несоответствие со знаком/без знака)

так в чем же разница между C4018 ('выражение': несоответствие подписанного/неподписанного) и предупреждения C4389 ("оператор": несоответствие подписанного/неподписанного) ?

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