Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

Может ли NULL давать не нулевое значение?

При программировании часто использую подобное выражение:
if (pointer) { .... }
что эквивалентно (по крайней мере для моей системы):
if (pointer != NULL)
где pointer указатель. Хочу удостовериться, что этот код не несет в себе опасности на других системах и т.д. В учебнике нашел только, что NULL возвращает значение не указывающее ни на какой объект. Но равно ли это значение 0 априори?


Ответ

Также внесу некоторые дополнения к ответам, которые дали @alexolut и @VladD.
Как вообще C решает истинно выражение expression в операторе if или нет:
if ( expression ) statement if ( expression ) statement else statement
?
Пункт 6.8.4.1 / 2 говорит следующее:
In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. [...]
То есть, выражение expression сравнивается с нулём. Если оно не равно нулю, то выражение expression считается истинным, если оно равно нулю, то expression считается ложным.
Таким образом, примеры в вашем вопросе интерпретируются так:
if ( pointer != 0 ) if ( (pointer != NULL) != 0 )
В стандарте языка явно оговорено (6.3.2.3 / 3), что и 0, и (void *)0, и NULL — нулевые указательные константы (null pointer constant). Для целей сравнения указателя и нулевой указательной константы, нулевая указательная константа преобразуется к типу указателя (6.5.9 / 5):
[...] If one operand is a pointer and the other is a null pointer constant, the null pointer constant is converted to the type of the pointer. [...]
Результат такого преобразования — нулевой указатель (null pointer). Если pointer не является нулевым указателем, то согласно пункту 6.5.9 / 6, оба выражения: pointer != 0 и pointer != NULL — истинны.
Некоторого пояснения заслуживает выражение (pointer != NULL) != 0. Относительно операторов != и == стандарт языка говорит следующее (6.5.9 / 3):
[...] Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type int. [...]
Таким образом, если pointer — не является нулевым указателем, то выражение (pointer != NULL) — равно 1, а значит выражение (pointer != NULL) != 0 истинно.

Комментариев нет:

Отправить комментарий