Expressions and statements
ES.100
Не смешивайте знаковую и беззнаковую арифметику
Причина
Избегайте неверных результатов.
Пример
int x = -3;
unsigned int y = 7;
cout << x - y << '\n'; // беззнаковый результат, возможно 4294967286
cout << x + y << '\n'; // беззнаковый результат: 4
cout << x * y << '\n'; // беззнаковый результат, возможно 4294967275
В более реалистичных примерах проблему обнаружить сложнее.
Примечание
К сожалению, C++ использует знаковые целые для индексов массивов, а стандартная библиотека — беззнаковые целые для индексов контейнеров. Это исключает последовательность. Используйте gsl::index для индексов; смотрите ES.107.
Контроль
- Компиляторы уже знают и иногда предупреждают.
- (Для уменьшения шума) Не отмечать смешанное сравнение знакового и беззнакового, если один из аргументов —
sizeofили вызов.size()контейнера, а другой —ptrdiff_t.