Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Отвечу сюда на всё сразу 04.03.05 21:14 Число просмотров: 2491
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 04.03.05 21:31 Количество правок: 1
|
Немного "кулаками после драки", но всё же выскажусь :)
> Не понял проблемы. NULL определено как ((void *)0) и в C > может неявно приводиться к указателю на любой тип. Вы будете удивлены, но определение NULL как (void *)0 не соответствует стандарту, как я недавно узнал (правда, стандарту C++, не C - но я подозреваю, что и последнему тоже). Стандарт явным образом прописывает, что NULL должен быть целой константой и определение как (void *)0 НЕ подходит. Однако благодаря процитированному в глубине нитки параграфу целый 0 может быть неявно приведён к указателю на любой тип.
Отсутствие сравнения в условии эквивалентно сравнению с литеральным нулём (не с NULL). Логическое отрицание гарантированно делает не-нулевые указатели нулём (не указателем, к слову), а нулевой указатель - ненулевым целым значением (не помню точно, но по-моему, Стандарт не определяет значение для !0, оговаривая лишь, что !0 != 0). Соответственно, сравнивать результат логического отрицания с указателем нельзя (компилятор как минимум выдаст предупреждение).
Вот.
P.S. Несмотря на то, что NULL, по стандарту - целое число, производители компиляторов всё же стараются, чтобы длина NULL равнялась длине указателя. Это позволяет спокойно использовать NULL (в отличие от 0), для указания конца переменного списка аргументов (в "функциях с многоточиями").
|
|
|