Во-первых, чтобы быть на 100% ясным, существует разница между между C и C ++
Вот. И во-вторых, вопрос о переполнении стека, который вы цитируете, не говорит о нулевых указателях; вводит недействительные указатели; указатели, которые, по крайней мере, насколько
Стандарт касается неопределенного поведения, просто пытаясь
Сравните их. Нет никакого способа проверить, является ли указатель
действительный.
В конце концов, есть три распространенных способа проверки на нулевой указатель:
if ( p != NULL ) ...
if ( p != 0 ) ...
if ( p ) ...
Вся работа, независимо от представления нулевого указателя на
машина. И все, так или иначе, вводят в заблуждение; какой ты
Выбор - это вопрос выбора наименее плохого. Формально первые два
идентичны для компилятора; константа NULL
или 0
конвертируется
на нулевой указатель типа p
и результаты преобразования
по сравнению с p
. Независимо от представления нулевого
указатель.
Третий немного отличается: p
неявно преобразуется
до bool
. Но неявное преобразование определяется как результат p
!= 0
, поэтому вы в конечном итоге получаете то же самое. (Что означает, что есть
действительно нет веских аргументов в пользу использования третьего стиля & mdash; он запутывает
с неявным преобразованием, без каких-либо компенсационных преимуществ.)
Какой из первых двух вы предпочитаете, это в основном вопрос стиля,
возможно, частично продиктовано вашим стилем программирования в другом месте:
в зависимости от идиомы, одна из ложь будет более надоедливым
чем другой. Если бы это был только вопрос сравнения, я думаю, что большинство
люди предпочли бы NULL
, но в чем-то вроде f( NULL )
,
будет выбрана перегрузка f( int )
, а не перегрузка с
указатель. Аналогично, если f
является шаблоном функции, f( NULL )
будет
создать шаблон на int
. (Конечно, некоторые компиляторы, такие как
g ++, выдаст предупреждение, если NULL
используется в контексте без указателя;
если вы используете g ++, вы действительно должны использовать NULL
.)
В C ++ 11 , конечно, предпочтительная идиома:
if ( p != nullptr ) ...
, что позволяет избежать большинства проблем с другими решениями. (Но это
не совместим с C: -).)