Почему передача (! NULL) в условии if-else истинна в C? - PullRequest
2 голосов
/ 07 марта 2019

В этих строках кода,

void main()
{
   if(!NULL)
     {
       printf("one.");
     }
   else
     {
       printf("two");
     }
}

вывод один. Это почему? Почему !NULL верно?

Ответы [ 3 ]

7 голосов
/ 07 марта 2019

Из стандарта C # 6.3.2.3p3 [выделение добавлено]

3 Целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *, называется константой нулевого указателя . 66) Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемый нулевым указателем, гарантированно сравнивается с неравным указателем на любой объект или функцию.

....
....

66) Макрос NULL определен в <stddef.h> (и других заголовках) как константа нулевого указателя ; см. 7.19.

Из стандарта C # 6.5.3.3p5

5 Результат оператора логического отрицания! равно 0, если значение его операнда сравнивается с 0, 1, если значение его операнда сравнивается равным 0. Результат имеет тип int. Выражение! E эквивалентно (0 == E).

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

if(!NULL)

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

if (0==NULL)

0==NULL оценивается как true. Следовательно, вы получаете вывод one.


Дополнительно:

void тип возврата main() не соответствует стандарту. Вместо этого вы должны использовать int в качестве типа возврата main().

2 голосов
/ 07 марта 2019

NULL - указатель, эквивалентный 0. 0 ложно в C, а любое другое ненулевое значение положительно.

Следовательно, если! (Не оператор) применяется к NULL (false), это означает, что! NULL имеет значение true.

Таким образом, условие if удовлетворяется как истинное и единичное. печатается.

1 голос
/ 07 марта 2019

Вкратце: -

В соответствии с C-кодированием стандартов,

ненулевое значение эквивалентно TRUE
Ноль & NULL эквивалентны FALSE

Следовательно, (! NULL) эквивалентно TRUE .Итак, , если выполняется блок и печатается one. .

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