Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Thank you! 03.03.05 17:28 Число просмотров: 2296
Автор: void <Grebnev Valery> Статус: 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 может > таковым и не быть).
Thank you!
Does it mean that the following code will be incorrect?
if ( !some_function() )
{
…
}
saying that
if ( some_function() == 0 )
{
…
}
instead of
// correct
if ( some_function() == NULL )
{
…
}
PS.
Sorry. I don’t have “Russian” keyboard at the moment; but I don’t want this question to be postponed.
|
|
|