Я уже проверил этот пост Могу ли я использовать if (указатель) вместо if (указатель! = NULL)? и некоторые другие посты в сети.
Но это не говорит о разнице между двумя утверждениями.
Проблема: Когда я запустил cpplint.py в своем коде cpp, я обнаружил проблемы, когда я проверял указатели на NULL.
Я предпочел проверить с помощью простого
if(pointer) //statement1
но cpplint говорит, что вы должны проверить, как
if(pointer != NULL) //statement2
Так что я просто хочу знать, есть ли какие-либо преимущества оператор2 над statement1 ? Существуют ли сценарии, в которых statement1 может создать проблему?
За работой: Насколько мне известно, есть нет разницы в работе обоих утверждений. Это просто изменение стиля кодирования.
Я предпочитаю использовать как statement1, так как
- Это просто, читабельно
- Нет напряжения отсутствует (
=
) по ошибке над равенством (==
) в сравнении
Но cpplint поднимает эту проблему как проблему, тогда я мог бы упустить некоторую выгоду.
Замечания: Java также не поддерживает statement1.
Нет, если 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, они ожидают, что вы будете следовать этому стилю, который облегчает совместную работу.
Нет разницы между if (указатель) и если (указатель! = NULL). if (указатель) используется для оптимизации кода.