Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Попробую развеять 03.03.05 11:42 Число просмотров: 2347
Автор: amirul <Serge> Статус: The Elderman
|
> Верно ты сказал, что NULL определён как ((void *)0) (хотя > не всегда).
Да, действительно, NULL может и не иметь бинарное представление нули-во-всех-битах, тем не менее гарантируется, что с ним можно производить оперции сравнения/присвоения и все будет работать.
> Не помню где ... , но мелькало замечание ГУРей, что дескать > нет гарантии, что при использовании "некоторого" компилера > (знать бы мне, что за компиллер;)))) код с вызовом > некоторой функции, возвращающий, например, char * :
Сомневаюсь в их правоте. NULL гарантированно приводится к любому типу и наоборот. И при этом остается NULL-ом.
> ПС. Прошу прощения за тупые вопросы. Тем более, что на > практике всё работает, как ты говоришь.
Не могу сразу придумать для C код, иллюстрирующий то, что при любых махинациях NULL остается NULL-ом, но вот код на C++
struct Base1 {
long data;
};
struct Base2 {
long data;
};
struct Derived: public Base1, public Base2 {
};
void
main() {
Derived *pd = NULL;
Base1 *pb1 = pd;
Base2 *pd2 = pd;
if (pb1 != NULL|pb2 != NULL) {
// Отформатировать винчестер
}
};
---
Указатели на разные базовые классы в итоге равны друг другу и указателю на класс-наследник. А все потому, что в коде приведения типов стоит проверка на NULL и указатель смещается только если указатель не NULL. Это все к вопросу о гарантии того, что NULL остается NULL-ом при любых приведениях типов: то есть гарантируется что сравнение такого указателя с NULL-ом будет возвращать истину (а как это реализовано - неважно). И именно поэтому стандарт не рекомендует сравнивать с нулем (потому что NULL может таковым и не быть).
|
|
|