> > Верно ты сказал, что NULL определён как ((void *)0) > (хотя > > не всегда). > > Да, действительно, NULL может и не иметь бинарное > представление нули-во-всех-битах, тем не менее > гарантируется, что с ним можно производить оперции > сравнения/присвоения и все будет работать. > > > Не помню где ... , но мелькало замечание ГУРей, что > дескать > > нет гарантии, что при использовании "некоторого" > компилера > > (знать бы мне, что за компиллер;)))) код с вызовом > > некоторой функции, возвращающий, например, char * : > > Сомневаюсь в их правоте. NULL гарантированно приводится к > любому типу и наоборот. И при этом остается NULL-ом. > > > ПС. Прошу прощения за тупые вопросы. Тем более, что на > > практике всё работает, как ты говоришь. > > Не могу сразу придумать для C код, иллюстрирующий то, что > при любых махинациях NULL остается NULL-ом, но вот код на > C++ > >
---
> > Указатели на разные базовые классы в итоге равны друг другу > и указателю на класс-наследник. А все потому, что в коде > приведения типов стоит проверка на 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.