Является ли в C условие: if(a != NULL) таким же, как условие if(a)?

Допустим, a - это указатель, и после выделения для него памяти я хочу проверить, успешно ли выделена память, я видел два способа сделать это:

if(a != NULL)

if(a)

В чем разница между первым и вторым утверждениями?


person HakunaMatata    schedule 19.10.2017    source источник
comment
Они закончатся тем же самым.   -  person Steve    schedule 19.10.2017
comment
NULL — это макрос, который обычно определяется как 0, поэтому первое выражение такое же, как (a != 0), второе также проверяет, если a != 0, поэтому это то же самое редактирование: обычно   -  person Paweł Dymowski    schedule 19.10.2017
comment
Да, если a является указателем, может быть иначе, если a не является указателем, в зависимости от определения NULL.   -  person Antti Haapala    schedule 19.10.2017
comment
@PawełDymowski неверно, NULL - это макрос, который определяется как константа нулевого указателя, определяемая реализацией.   -  person Antti Haapala    schedule 19.10.2017
comment
if(a != NULL) и if(a) — логическое значение. - if(a != NULL) в этом случае мы напрямую устанавливаем условие не равным нулю. - if(a), но в этом случае, когда a не равно нулю, если значение bool будет истинным, и запустите оператор if, а когда a равно null, значение bool будет ложным, и если не будет выполняться. ТАК оба заканчиваются тем же результатом.   -  person Salman    schedule 19.10.2017
comment
Они делают то же самое. Единственная разница, которую я вижу, это читабельность.   -  person Glenn    schedule 19.10.2017
comment
Как это указывает на выделение памяти?   -  person matt    schedule 19.10.2017


Ответы (4)


условие : if(a != NULL) такое же, как условие if(a)?

Они достигают той же цели. Единственная реальная разница заключается в удобочитаемости.


Их эффект одинаков, поскольку они приведут к одному и тому же результату.

NULL — это макрос, который почти всегда равен 0, поэтому:

if(a != NULL)

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

if(a != 0)

что очень похоже на:

if(a)

так как он проверит, является ли выражение a истинным.

Таким образом, если a является указателем, они будут одинаковыми. Если это не так, то это будет зависеть от того, как определяется NULL (что, как я уже сказал, почти всегда 0).

person gsamaras    schedule 19.10.2017
comment
Не могли бы вы немного уточнить? - person Marievi; 19.10.2017
comment
конечно, @Marievi, уже в пути. - person gsamaras; 19.10.2017

Согласно c faq :

if(p) эквивалентно if(p != 0)

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

person msc    schedule 19.10.2017

(a != NULL) возвращает логическое значение, которое совпадает с (a). Оператор if возвращает false, если содержимое равно 0, и true в противном случае. NULL означает 0, поэтому, если a == 0, if возвращает false. Так что это точно то же самое для компилятора.

Надеюсь, это поможет вам!

person cydef    schedule 19.10.2017

Нет никакой функциональной разницы; они эквивалентны, и оба они проверяют нулевой указатель.

Любые предпочтения чисто субъективны. Просто используйте то, что вам нравится, или то, за чем следуют ваши коллеги-программисты в вашем проекте/организации.

person P.P    schedule 19.10.2017
comment
Не могли бы вы немного уточнить? - person Marievi; 19.10.2017