Разница между if(указатель) и if(указатель!= NULL) в C++, проблема cpplint

Я уже проверил этот пост Могу ли я использовать if (указатель) вместо if (указатель!= NULL)? и некоторые другие посты в сети.

Но это не говорит о разнице между двумя утверждениями.

Проблема: Когда я запустил cpplint.py в своем коде cpp, я обнаружил проблемы, когда я проверял указатели на NULL. Я предпочел проверить с помощью простого

if(pointer)         //statement1

но cpplint говорит, что вы должны проверить, как

if(pointer != NULL)        //statement2

Итак, я просто хочу знать, есть ли какие-либо преимущества оператора Statement2 по сравнению с оператором1? Существуют ли сценарии, в которых Statement1 может создать проблему?

Работа: Насколько мне известно, нет никакой разницы в работе обоих утверждений. Это просто изменение стиля кодирования.

Я предпочитаю использовать как Statement1, потому что

  • Это просто, читабельно
  • Нет напряжения отсутствует (=) по ошибке над равенством (==) в сравнении

Но cpplint поднимает эту проблему как проблему, тогда я мог бы упустить некоторую выгоду.

Примечание: Java также не поддерживает Statement1.

5 ответов

Решение

Нет, если pointer на самом деле это тип указателя, нет никакой разницы, поэтому здесь все вопрос стиля кодирования. Стиль кодирования, в свою очередь, зависит от привычек в разных сообществах, поэтому не может быть общей рекомендации.

Я лично предпочитаю первое, потому что оно короче и более точно и избегает использования фиктивного макроса NULL,

В С NULL это могут быть разные вещи (целое число или указатель), а в C++ его использование даже не рекомендуется в настоящее время. Вы должны хотя бы использовать nullptr, там.

Вы используете венгерскую нотацию, где можно определить, является ли переменная указателем. Пока это - родной или умный - нет никакой разницы. Однако, когда кто-то меняет его на другой косвенный тип (например, std::optional<>), то второе не получится. Поэтому я предлагаю продолжать использовать первое: это не Java, а C++.

В C++, предполагая ptr это указатель, сравнения if (ptr) а также if (ptr != NULL) функционально эквивалентны.

В C++11 и более поздних версиях часто считается предпочтительным использовать альтернативные if (ptr != nullptr),

Для простой проверки указателя различия в этих параметрах действительно стилистические. Механизмы могут немного отличаться, но конечный результат тот же.

Как и большинство автоматических контролеров, cpplint, по умолчанию, чаще жалуется на нарушения одних правил стиля, чем другие. Будет ли какой-то конкретный набор правил правильным или неправильным, зависит от того, что нужно для вашего проекта.

Для типов классов, которые можно разумно сравнить с указателем (например, типами интеллектуальных указателей), предпочтительный тест зависит от того, какой набор операций (операторы сравнения, неявные преобразования и т. Д.) Поддерживает этот тип.

В C, посмотри:

int *ptr=malloc(10*sizeof *ptr);
free(ptr); // though the memory is freed, the ptr is not auto-set to NULL
if (ptr)
{
printf ("ptr is not null\n");
}

Так что вы должны поставить

ptr=NULL; // ptr is explicitly made to point at nothing
// The above step is mandatory.

после free,

Так как ответ в if-statement можно порекомендовать сделать

if ( ptr == NULL ) // This is mostly a coding style & improves readability?

или лучше

if ( NULL == ptr ) // less chances of error

Ну, [сайт] говорит о cpplint что это:

Автоматическая проверка того, что файл C++ соответствует руководству по стилю Google C++

Итак, еще раз, это чей-то стиль, который имеет значение. Скажем, если вы внесете свой вклад в чей-то код в Google, они ожидают, что вы будете следовать этому стилю, который облегчает совместную работу.

Есть один сценарий, который может создать проблему при использовании statement1.

Рассмотрим следующий код, который может иметь два разных значения.

bool* is_done = ...;

// Is this checking if `is_done` is not null, or actually
// intended to check if `*is_done` is true?
if (is_done) {
  ...
}

Если вы намеревались выполнить нулевую проверку, все в порядке. Но если ваше первоначальное намерение - проверить, не*is_done верно, но случайно пропущена звездочка, этот код может привести к совершенно нежелательному поведению и потребовать от вас потратить X часов, чтобы выяснить причину.

Этого можно было избежать, явно проверив такой оператор, как

// Now this results in a compile error and forces you to write
// `*is_done` instead.
if (is_done == true) {
  ...
}

Это применимо к любым типам, которые можно неявно преобразовать в bool как std::unique_ptr.

Кто-то может возразить, что вышеуказанный случай слишком редок, и все же предпочтет statement1в пользу простоты. Я думаю, что это справедливо, и оба стиля приемлемы. Но некоторые организации, например Google, могут посоветовать вам следовать их стилю программирования, чтобы сохранить урок, который они извлекли ранее.

Нет разницы между if(указатель) и если (указатель!= NULL). if(указатель) используется для оптимизации кода.

Другие вопросы по тегам