Рассмотрим следующий код:Почему нет недопустимого предупреждения для неподписанного типа?
unsigned int n = 0;
unsigned int m = n - 1; // no warning here?
if (n > -1) {
std::cout << "n > -1.\n";
} else {
std::cout << "yes, 0 is not > -1.\n";
}
Код выше выдает предупреждение о if
состоянии if (m > -1)
для сравнения подписанных и неподписанных целые выражения. У меня нет конкуренции. Меня беспокоят первые два оператора присваивания.
unsigned int n = 0;
unsigned int m = n - 1;
Мое мышление является то, что компилятор должен дать мне предупреждение о втором задании, потому что он знает, что переменная n
не имеет знака со значением 0
от первой линии, и была предпринята попытка вычесть из нулевое значение и присвоение его неподписанному типу.
Если следующая строка после второго присваивания отличается от оператора if
или чего-то подобного, то соответствующий код мог проскользнуть.
Да, есть преобразование сужения перед назначением m
, и да, компилятор не жалуется на это, о чем также упоминал Маршалл Клоу в своем рассказе Lightning Talk от C++ Now 2017 (Fighting Compiler Warnings).
short s = 3 * 6;
short s = integer * integer;
short s = integer;
Итак, почему компилятор не может рассказать мне о возможном недополнении этого кода?
Составители:
- Clang 3.7/4.0 (-Wall -Wextra)
- GCC 5.3/7.1.1 (-Wall -Wextra -pedantic)
- Microsoft C/C++ 19.00.23506
Какое предупреждение вы ожидаете получить? Предупреждение, которое вы получаете в выражении if, - это сравнение между подписанными и беззнаковыми целыми выражениями *, которое не является тем, что происходит в 'unsigned int m = n - 1;' – NathanOliver
Вы пытались использовать опции '-Wall' и' -Wextra' GCC? – Plouff
@Plouff: Да, я использовал -Wall -Wextra с GCC. –