Чем отличается null от 0
Перейти к содержимому

Чем отличается null от 0

  • автор:

Отличие 0 or NULL? Что лучше использовать?

Чем отличается 0 от NULL? И как вообще называют такие имена как NULL? Какие ищё есть подобные этому примеру?

Отслеживать
8,667 18 18 золотых знаков 74 74 серебряных знака 181 181 бронзовый знак
задан 16 окт 2011 в 12:38
1,287 12 12 золотых знаков 36 36 серебряных знаков 62 62 бронзовых знака

NULL це іменована константа — \#define NULL 0 прикладів можна навести багато-на С раніше не було логічного типу і його можна було відтворити із \#define bool int \#define true 1 \#define false 0 define це макрос, який повідомляє компілятору, що будь де(окрім тексту в лапках) треба одне замінити другим

9 дек 2011 в 12:24

Илья, я уважаю украинскую культуру и язык, но здесь принято, все-таки, писать по-русски. Если можешь, пиши по-русски, уважай других, поскольку не все на форуме владеют украинским языком.

9 дек 2011 в 12:42

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

NULL — это всего лишь #define на 0 . С выходом нового стандарта рекомендуется использовать nullptr .

Отслеживать
ответ дан 16 окт 2011 в 12:41
3,245 17 17 серебряных знаков 32 32 бронзовых знака
а какие ищё есть #define ?
16 окт 2011 в 12:42
Ещё есть любые define — их можно самому объявлять.
16 окт 2011 в 12:58

Ещё можно создать свой аналог nullptr:

class null < null() <>void operator&() const; public: template operator T*() const static null _inst; > const &null=null::_inst; class null null::_inst; 

Отслеживать
ответ дан 16 окт 2011 в 14:17
5,441 21 21 серебряный знак 32 32 бронзовых знака

А какова практическая ценность подобных конструкций ? Обсуждение на конференциях по теоретическим основам семантики языков программирования и написание диссертаций ?

16 окт 2011 в 14:58

NULL не всегда соответствует nullptr. Например, можно написать int n=NULL, но нельзя написать n=nullptr или, используя мой null n=null. Если есть перегруженная функция void func(int x); void func(void* ptr); человек может захотеть вызвать вариант с void*, передав нулевой указатель, но если он использует NULL, то вызовет int-вариант. nullptr и null дадут ожидаемый результат. Если nullptr не поддерживается, лучше использовать этот null.

16 окт 2011 в 15:07

@avp Ну примерно с той же целью, зачем нормальные программисты используют статические ассерты. Я, например, за то, чтобы переносить часть проверок соответствия на компилятор, нежели потом отлавливать их в рантайме. Тем более, что сработавщий статический ассерт лучше, чем неизвестные креши в продакшене из-за того, что, например, структура оказалась выровнена не так, как ты ожидал. С nullptr та же история.

17 окт 2011 в 15:27

@avp Ну, не буду особо спорить. Тут просто дело в том, что кресты — это обобщение над простым C , соответственно, чтобы получить совместимость кодовой базы, многие вещи решались костылями, которые будут работать и там, и там. А дальше для костылей начинают придумывать новые костыли, чтобы язык соответствовал каким-то более прогрессивным понятиям, типа, *»О, строгая типизация NULL!», давайте-ка это запилим. А т.к #define NULL уже есть, то давайте обзовем его nullptr и включим в новый стандарт. Короче, стандартный путь для несовершенного языка, который развивался на протяжении 20 лет.

Чем NULL отличается от 0??

В случае SQL — NULL это специальное значение, трактующееся, как «значение не определено». И при сравнениях оно ведёт себя особым образом, всегда выдаёт NULL вместо true или false, не участвует в агрегатных функциях вроде среднего арифметического или count с указанием явного столбца.
В языках программирования оно ведёт себя иначе, чем в SQL, и вышесказанное мной там не актуально.
Парочку примеров:
https://www.db-fiddle.com/f/pBAssyZkaP4tEvpXtjcqmp/1
https://www.db-fiddle.com/f/cbp3JJCaQmkvuPrPNM1AEy/0

Остальные ответы

NULL отличается от 0 тем, что NULL не представляет никакое значение, в то время как 0 представляет арифметическое значение нуля.

NULL — нет ничего. А «ноль» — есть вполне себе нормальное и законное число с математическим значением 0

NULL определён как (void*)0, т.е нулевой адрес. По этому адресу не обязательно будет нулевое значение. Но оно никогда не будет прочитано. Потому что функции языка всегда будут трактовать нулевой адрес особым образом. В зависимости от контекста.

Лайт ЯгамиИскусственный Интеллект (278914) 1 год назад
Если программа кривая, то в ней может быть попытка чтения этого адреса, и сегфолт)
22Мастер (1412) 9 месяцев назад
Это самый лучший и правильный ответ. Но простые смертные его не поймут)))

NULL это константное значение которое хранит значение нуль, используется для инициализации пустого указателя, переменные указатели могут быть инициализированы нулем или адресом переменной. Нуль единственное числовое значение которое может использовано для инициализации пустого указателя, но вместо значения нуль, используют константу NULL т.к. это более универсальное значение.

NULL в SQL: Что это такое и почему его знание необходимо каждому разработчику

NULL — это специальное значение, которое используется в SQL для обозначения отсутствия данных. Оно отличается от пустой строки или нулевого значения, так как NULL означает отсутствие какого-либо значения в ячейке таблицы.

История появления NULL в SQL довольно интересна и длинна. В начале 1970-х годов Д. Камерер (D. Chamberlin) и Р. Бойд (R. Boyce) предложили использовать реляционную модель для полной замены иерархических и сетевых моделей данных, которые были актуальны в то время. Полная замена предполагала возможность хранения значений NULL в таблицах структуры базы данных.

Первоначально, NULL был создан как интегральный элемент реляционной модели данных. Это означало, что NULL мог быть использован в качестве значения для любого типа данных (целого числа, строки и т.д.) или даже целой строки (например, таких значений как «неизвестно» или «нет данных»).

Когда была разработана SQL, NULL был реализован как специальное значение или маркер, который указывает на отсутствие значения в столбце. Таким образом, в SQL NULL означает отсутствие значения или неопределенное значение.

Однако, NULL создал некоторые проблемы при работе с данными в SQL. Например, если вы выполняете операцию на столбце, содержащем NULL значение, результат операции также будет NULL. Это означает, что использование NULL может приводить к нежелательным результатам, таким как непредсказуемое поведение.

Однако, важно понимать, что NULL не обязательно означает отсутствие информации или отсутствие значения в столбце. NULL может быть использован для разных целей, таких как указание на неопределенный результат для вычислений или как маркер для отметки отсутствия значения в таблице.

Рассмотрим несколько SQL операций с NULL:

  1. Как назначить значение NULL в SQL?
    Значение NULL можно явно указать при создании таблицы или добавления записей в таблицу. Например, при создании таблицы можно указать, что один из столбцов не обязательно должен иметь значение, используя ключевое слово NULL.
  2. Как проверить NULL в SQL?
    Для того чтобы проверить значение NULL в SQL, используется оператор IS NULL. Этот оператор возвращает true, если значение столбца равно NULL.
  3. NULL и требования целостности данных
    NULL может нарушить требования целостности данных, которые гарантируют, что данные в таблице являются валидными и согласованными. Например, требование необходимости заполнения поля значением может быть нарушено, если значение NULL допустимо.
  4. Ограничение NOT NULL
    Ограничение NOT NULL позволяет определить, что значение в столбце не может быть NULL. Это означает, что при добавлении записи в таблицу обязательно должно быть заполнено значение для данного столбца.
  5. ISNULL
    Функция ISNULL возвращает первый аргумент, если он не равен NULL, и второй аргумент, если первый аргумент равен NULL. ISNULL наиболее часто используется для замены значений NULL на конкретные значения.
  6. COALESCE
    Функция COALESCE возвращает первый аргумент, который не равняется NULL. COALESCE может быть полезна, когда вам нужно выбрать первое значение из двух или нескольких, которые могут быть пустыми.
  7. NULLIF
    Функция NULLIF возвращает NULL, если два аргумента равны. Если аргументы не равны, она возвращает первый аргумент. Эта функция может быть полезна для условного выполнения некоторых операций в зависимости от того, равны ли значения.
Почему знание NULL важно для SQL-разработчиков?

Понимание того, что такое NULL и как он работает, важно для SQL-разработчиков, так как они должны убедиться, что данные в таблице корректны и не содержат NULL, если это не предусмотрено требованиями для соответствующего столбца таблицы. Также знание правильной работы с NULL в SQL позволяет избежать неожиданного поведения запросов и операторов, которые могут привести к ошибкам или неверным результатам. Кроме того, понимание того, как обрабатывать значения NULL, может улучшить эффективность запросов, так как правильное использование функций для работы с NULL может сократить количество кода и убрать дублирование.

NULL в базе данных может привести к ошибкам, например:

  1. Сравнение значений. Если в таблице присутствуют значения NULL, то при выполнении операции сравнения, например, WHERE column_name = NULL, результатом будет False. Вместо этого нужно использовать оператор IS NULL.
  2. Вычисления. Если при выполнении арифметических операций включены значения NULL, то результат такой операции тоже будет NULL. Например, 5 + NULL = NULL.
  3. Сортировка. При сортировке значений в столбце, которые содержат NULL, может произойти непредсказуемый результат в зависимости от реализации сортировки в базе.
  4. Внешние ключи. Если в таблице соединения используются внешние ключи, то значение NULL может привести к нарушению связной целостности.
  5. Агрегирующие функции. При использовании агрегирующих функций в запросах, значения NULL могут не быть учтены в результате.
  6. Вывод на экран. Если значение NULL выводится на экран пользователя, это может вызвать возможное недопонимание и ухудшение пользовательского опыта.

Все эти проблемы могут привести к ошибкам при обработке данных и привести к неправильным результатам. Необходимо быть осторожным при работе с NULL значениями в базе данных и учитывать их взаимодействие при проектировании и разработке баз данных.

Пример неудачного использования NULL

Допустим, у нас есть таблица, в которой хранится информация о заказах в интернет-магазине. Среди полей есть поля, отражающие дату создания заказа (orderdate) и дату его доставки (deliverydate).

Однажды в этой таблице обнаружилась ошибка: у нескольких заказов deliverydate было не заполнено, т.е. им было присвоено значение NULL. Разработчики не заметили этого и продолжили работу с данными.

Однако при анализе статистики продаж на одном из графиков заказы отображались в зависимости от даты доставки. Из-за того, что несколько заказов не имели значения в поле deliverydate, они не отображались на графике вовсе, что привело к искажению реальных данных и ошибочным выводам о продажах на определенные даты.

Эта ошибка привела к тому, что команда интернет-магазина долго работала с неточными данными, и необходимо было потратить много времени на исправление ошибки и калибровку аналитических инструментов. Все эти проблемы могли быть исправлены, если бы разработчики были внимательными и не допустили присвоения значения NULL в поле, которое требует обязательного заполнения.

В итоге, знание NULL очень важно для SQL-разработчиков, так как неправильное использование NULL может привести к ошибкам в запросах и значительно затруднить дальнейшую обработку данных. Однако, правильное использование NULL может упростить запросы и дать возможность корректно хранить и обрабатывать данные. Поэтому, при работе с базами данных, SQL-разработчикам необходимо быть внимательными и осознанными в использовании NULL.

Бонус

Три вопроса с собеседований, где вас проверяют на знание NULL в SQL:

  1. Как проверить, есть ли NULL значение в определенном столбце таблицы в SQL? Ответ: Необходимо использовать оператор «IS NULL» или «IS NOT NULL». Например, чтобы проверить, есть ли NULL значение в столбце «name» таблицы «users», нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NULL;
  2. Как можно заменить NULL значения на определенное значение в SQL? Ответ: Для замены NULL значений можно использовать оператор «COALESCE». Например, чтобы заменить NULL значения в столбце «price» таблицы «products» на значение 0, нужно выполнить следующий запрос: SELECT COALESCE(price, 0) FROM products;
  3. Как можно проверить, что два столбца имеют одинаковые значения, включая NULL, в SQL? Ответ: Для этого нужно использовать оператор «IS NOT DISTINCT FROM». Он сравнивает значения двух столбцов, включая NULL значения. Например, чтобы проверить, что значения столбцов «name» и «address» в таблице «users» совпадают, нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NOT DISTINCT FROM address;

Чем отличается null от 0

Здраствуйте.
Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

Re: чем 0 отличается от NULL?

От: Аноним
Дата: 25.06.07 08:31
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
А посмотреть определение слабо?

Re: чем 0 отличается от NULL?

От: Cruser
Дата: 25.06.07 08:44
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

#if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif

Re: чем 0 отличается от NULL?

От: NikeByNike
Дата: 25.06.07 08:49
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

NULL как макрос остался для совместимости с С. В С++ смысла уже не имеет.

Нужно разобрать угил.
Re: чем 0 отличается от NULL?

От: DuaMaHT
Дата: 25.06.07 08:51
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

«0» — это значение, константа. A null указывает на «пустое место» — объявленную, но неинициализированную переменную, объект и т.п.

Re: чем 0 отличается от NULL?

От: Андрей Коростелев http://www.korostelev.net/
Дата: 25.06.07 09:03
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

Автор: Андрей Тарасевич
Дата: 10.12.03
Re: чем 0 отличается от NULL?

От: Roman Odaisky
Дата: 25.06.07 11:16
Оценка: 2 (2)

Здравствуйте, Аноним, Вы писали:

А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?

В двух словах: в C++ #define NULL 0.

В следующем стандарте будет nullptr — то же самое, но строже. Например, тип NULL, как ни крути, int, хотя int-то здесь и ни при чем. nullptr будет приводиться к любым указателям, но не к целочисленным типам, как сейчас. В принципе, nullptr можно сделать и сейчас:

class NullptrType < public: template class X> operator X* () const < return 0; > template class R, class C> operator R C::* () const < return 0; > private: void operator &() const; >; static NullptrType const nullptr; char* s = NULL; // OK int i = NULL; // OK! char* s = nullptr; // OK int i = nullptr; // error void f(int); void f(void *); f(NULL); // 1 f(nullptr); // 2 X* xs[10]; std::fill(xs, xs + 10, NULL); // error std::fill(xs, xs + 10, nullptr); // OK

До последнего не верил в пирамиду Лебедева.
Re[2]: чем 0 отличается от NULL?

От: NikeByNike
Дата: 25.06.07 11:25
Оценка:

Здравствуйте, DuaMaHT, Вы писали:

DMH>»0″ — это значение, константа. A null указывает на «пустое место» — объявленную, но неинициализированную переменную, объект и т.п.

0 и NULL — одно и тоже.

Нужно разобрать угил.
Re[2]: чем 0 отличается от NULL?

От: jazzer Skype: enerjazzer
Дата: 25.06.07 11:37
Оценка: 1 (1)

Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Аноним, Вы писали:

RO>В двух словах: в C++ #define NULL 0.
либо 0L, либо 0UL, либо еще чего-нть.

RO>В следующем стандарте будет nullptr — то же самое, но строже.
В текущей версии предлоежния — нет (хотя в первой версии предложения было действительно то же самое):

We do not propose to define the standard library macro NULL to nullptr. We considered that and liked the idea, but the EWG opinion was that it would break too much code, even though in many cases that would be code that deserved to be broken. New code should use the cleaner and safer nullptr.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2214.pdf

RO>Например, тип NULL, как ни крути, int, хотя int-то здесь и ни при чем.
или long. или любой другой тип, который захотелось данной реализации.
Короче, нулевой целочисленный литерал любого целочисленного типа:

The macro NULL is an implementation-defined C++ null pointer constant in this International Standard
(4.10).

A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero.

RO>В принципе, nullptr можно сделать и сейчас:
(S. Meyers. More Effective C++, Item 25)

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got If you always do what you always did

Re[2]: чем 0 отличается от NULL?

От: Аноним
Дата: 25.06.07 13:50
Оценка:

Здравствуйте, Аноним, Вы писали:
а для чего тогда форум? чтоб всех в ман тыкать? если уж тыкаете, то хоть бы указали в каком именно файле это определение можно посмотреть (берёшься за дело, сделай его нормально).

Re[3]: чем 0 отличается от NULL?

От: Roman Odaisky
Дата: 25.06.07 22:11
Оценка:

Здравствуйте, jazzer, Вы писали:

J>(S. Meyers. More Effective C++, Item 25) 😉

Я видел несколько реализаций nullptr в рамках C++03. Ни одна не понравилась, как-то они тяп-ляп сделаны.

До последнего не верил в пирамиду Лебедева.
Re[3]: чем 0 отличается от NULL?

От: jazzer Skype: enerjazzer
Дата: 26.06.07 00:42
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:
А>а для чего тогда форум? чтоб всех в ман тыкать? если уж тыкаете, то хоть бы указали в каком именно файле это определение можно посмотреть (берёшься за дело, сделай его нормально).

Если возник вопрос «Что такое Х в С++» — искать ответ надо в Стандарте С++ (актуальная ревизия — 2003 год).

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got If you always do what you always did

Re[4]: чем 0 отличается от NULL?

От: jazzer Skype: enerjazzer
Дата: 26.06.07 00:52
Оценка:

Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, jazzer, Вы писали:

J>>(S. Meyers. More Effective C++, Item 25)

RO>Я видел несколько реализаций nullptr в рамках C++03. Ни одна не понравилась, как-то они тяп-ляп сделаны.

Я вот чего не понял. Они говорят, что nullptr будет считаться соответствием как для T*, так и для T::*. Но все объяснения о том, как это работает, относятся к одновременному существованию шаблонов для T* и для T::* и к тому, что в этом случае будет неоднозначность. Поэтому для меня совершенно непонятным остался вопрос — если у нас есть только шаблон для T*, то как выведется T?
В смысле,

template class T> void f(T*); f(nullptr);

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got If you always do what you always did

Re[5]: чем 0 отличается от NULL?

От: Roman Odaisky
Дата: 26.06.07 06:59
Оценка:

Здравствуйте, jazzer, Вы писали:

J>Я вот чего не понял. Они говорят, что nullptr будет считаться соответствием как для T*, так и для T::*. Но все объяснения о том, как это работает, относятся к одновременному существованию шаблонов для T* и для T::* и к тому, что в этом случае будет неоднозначность. Поэтому для меня совершенно непонятным остался вопрос — если у нас есть только шаблон для T*, то как выведется T?
J>В смысле,
J>

J>template class T> void f(T*); J>f(nullptr); J>

Никак. А что здесь можно было бы ожидать? NULL бы тоже не помог. Надо что-то вроде f(nullptr).
До последнего не верил в пирамиду Лебедева.
Re[6]: чем 0 отличается от NULL?

От: jazzer Skype: enerjazzer
Дата: 26.06.07 08:16
Оценка:

Здравствуйте, Roman Odaisky, Вы писали:

RO>Никак. А что здесь можно было бы ожидать? NULL бы тоже не помог. Надо что-то вроде f(nullptr).

так а тогда непонятно, к чему вообще эти слова о том, что nullptr будет соответствовать этим шаблонам. Если ты явно инстанцируешь шаблон, то эти слова не нужны — достаточно приведения типов.

Блин, надо было Саттера спросить, пока он был здесь.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got If you always do what you always did

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *