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

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

но он не указывает никакой разницы между двумя утверждениями.

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

if(pointer)         //statement1

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

if(pointer != NULL)        //statement2

так Я просто хочу знать , есть ли преимущества statement2 над statement1 ? Есть ли некоторые сценарии, в которых statement1 может создать проблему ?

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

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

  • его Простой, Читаемый
  • нет напряжения отсутствует (=) по ошибке над равенством (==) в сравнении

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

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

5 ответов


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

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

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


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


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

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

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

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

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


на C, onsider:

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++ следует стиль c++ Google руководство

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


нет никакой разницы между if (указатель) и if (указатель!= НЕДЕЙСТВИТЕЛЬНЫЙ.) если(указатель) используется для оптимизации кода.