Является ли if (pointerVar) такой же, как if (pointerVar! = NULL)? - PullRequest
6 голосов
/ 11 февраля 2011

Простой вопрос:

Является ли if (pointerVar) таким же, как if (pointerVar!=NULL)?

Также, if (!pointerVar) совпадает с if (pointerVar==NULL)?

Дайте мнеВаш самый технически правильный / педантичный ответ.Эти два утверждения кажутся и имеют смысл действовать одинаково.Есть ли что-то не так с первым (кроме его немного более низкой читаемости)?

Ответы [ 4 ]

10 голосов
/ 11 февраля 2011

Для наиболее педантичного ответа вот соответствующие разделы спецификации.

Во-первых, вот как работают if операторы из раздела 6.4.4:

Значением условия, которое является инициализированным объявлением в выражении, отличном от оператора switch, является значение объявленной переменной , неявно преобразованной в тип bool. Если это преобразование неверно, программа некорректно сформирована.

"Но как указатели конвертируются в bool с?" Вы можете спросить. Ну, вот & 4.12.1:: -)

Значение арифметики, перечисления, указатель или указатель на тип члена может быть преобразовано в значение типа bool. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется в false; любое другое значение преобразуется в true.

Итак, это означает, что утверждение

if (ptr)

эквивалентно

if ((bool) ptr)

что в свою очередь эквивалентно

if (ptr == NULL)

А как же

if (!ptr)

Ну, спецификация C ++, раздел 5.3.1.8, говорит, что

Операнд оператора логического отрицания! неявно преобразуется в bool (пункт 4); его значение равно true, если преобразованный операнд равен false и false в противном случае. Тип результата: bool.

Так что это означает, что

if (!ptr)

эквивалентно

if (!(bool)ptr)

, что в свою очередь эквивалентно

if (!(ptr == NULL))

что в конечном итоге эквивалентно

if (ptr != NULL)

Уф! Это был интересный поиск. Надеюсь, что это отвечает на ваш вопрос!

Конечно, в этой истории есть кое-что еще. NULL не является частью языка C ++; это макрос в <cstddef>, определенный как

#define NULL 0

Это работает, потому что стандарт C ++ определяет нулевой указатель в & sect; 4.10.1 как

Константа нулевого указателя - это целочисленное константное выражение (5.19) rvalue типа integer, которое оценивается как ноль . Константа нулевого указателя может быть преобразована в тип указателя; результат является нулевым значением указателя этого типа и отличается от любого другого значения указателя на объект или указателя на тип функции

Итак, чтобы быть более правильным, я должен был использовать числовой литерал 0 в приведенных выше примерах. Однако, если у вас есть <cstddef>, то после предварительной обработки это работает с тем же кодом.

6 голосов
/ 11 февраля 2011

Если pointerVar - это необработанный указатель, тогда да. В противном случае, это зависит, хотя обычно для умных указателей оно практически не меняется.

В первой версии нет ничего плохого, на самом деле, многие опытные программисты на С ++ считают ее более читабельной.

1 голос
/ 11 февраля 2011

Да. Вы правы. Помните, что условие ложно, если оно возвращает нулевое значение, иначе оно истинно. В вышеприведенных выражениях, когда pointerVal = NULL, (NULL внутренне равен нулю), if(pointerVal) вернет false Обратное верно для if(!pointerVal), так как мы отрицаем условие.
Оба выражения являются действительными и обычной практикой.

1 голос
/ 11 февраля 2011

В C ++ NULL расширяется до 0 или 0L. Таким образом, if (pointerVar) совпадает с if (pointerVar!=NULL), а if (!pointerVar) совпадает с if (pointerVar==NULLL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...