Не добавляйте избыточные `==` или `!=` в условия
Причина
Это позволяет избежать многословия и устраняет ряд возможностей для ошибок. Способствует единообразию и соответствию общепринятому стилю.
Пример
По определению, условие в операторах if, while или for выбирает между true и false. Числовое значение сравнивается с 0, значение указателя — с nullptr.
// Все следующие варианты означают "если p не nullptr"
if (p) { ... } // хорошо
if (p != 0) { ... } // избыточное !=0, плохо: не используйте 0 для указателей
if (p != nullptr) { ... } // избыточное !=nullptr, не рекомендуется
Зачастую if (p) читается как «если p действителен», что прямо выражает намерение программиста, тогда как if (p != nullptr) является многословным обходным путём.
Пример
Правило особенно полезно, когда в качестве условия используется объявление:
if (auto pc = dynamic_cast<Circle*>(ps)) { ... } // выполнить, если ps указывает на Circle, хорошо
if (auto pc = dynamic_cast<Circle*>(ps); pc != nullptr) { ... } // не рекомендуется
Пример
Обратите внимание, что в условиях применяются неявные преобразования к bool. Например:
for (string s; cin >> s; ) v.push_back(s);
Здесь вызывается operator bool() у istream.
Примечание
Явное сравнение целого числа с 0 в общем случае не является избыточным. Причина в том, что (в отличие от указателей и булевых значений) целое число часто имеет более двух разумных значений. Кроме того, 0 (ноль) нередко означает успех. Поэтому лучше быть точным в сравнении.
void f(int i)
{
if (i) // подозрительно
// ...
if (i == success) // возможно, лучше
// ...
}
Всегда помните, что целое число может принимать более двух значений.
Пример (плохой)
Замечено, что
if(strcmp(p1, p2)) { ... } // равны ли две C-строки? (ошибка!)
является распространённой ошибкой начинающих. Если вы используете C-строки, необходимо хорошо знать функции из <cstring>. Многословная запись:
if(strcmp(p1, p2) != 0) { ... } // равны ли две C-строки? (ошибка!)
сама по себе также не спасёт.
Примечание
Противоположное условие проще всего выражается через отрицание:
// Все следующие варианты означают "если p nullptr"
if (!p) { ... } // хорошо
if (p == 0) { ... } // избыточное == 0, плохо: не используйте 0 для указателей
if (p == nullptr) { ... } // избыточное == nullptr, не рекомендуется
Контроль
Просто: проверять избыточное использование != и == в условиях.