Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > NULL или 0?


Автор: Hukuma 6.11.2009, 14:00

Здравствуйте! Я не писал на С, начал сразу учить С++. Встал вопрос о том, что правильнее - присваивать указателю NULL или 0, когда он больше не нужен. Я знаю, что в С++ рекомендуется использовать 0, но более опытные коллеги ратуют за NULL.  Отсюда вопрос - если сейчас привыкнуть 0, то не будет ли проблем при написании программ на компиляторе С? И есть ли такие компиляторы С++, которые считаю, что

Код

int *ptr=0


и 

Код

int *ptr=NULL


разные вещи?

Автор: Anikmar 6.11.2009, 14:04
Надо писать NULL.

Автор: Hukuma 6.11.2009, 14:06
Anikmar, вы знаете из личного опыта? Я не прошу доказательств или убеждений, мне просто интересен вопрос переносимости кода, содержащего присваивание указателя на 0 на компилятор С.

Автор: azesmcar 6.11.2009, 14:08
Hukuma

В C++ это тоже самое что и 0
Цитата(C++ standard)

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

Possible definitions include 0 and 0L, but not (void*)0.

а вот в C
Цитата(C99 standard)

In pointer comparisons, one of the operands may be of type void*. In particular, this allows
NULL, which can be defined as (void*)0, to be compared to any object pointer.

потому и
Цитата(Hukuma @  6.11.2009,  14:00 Найти цитируемый пост)
разные вещи?


Я лично предпочитаю называть вещи своими именами, NULL вместо 0, так нагляднее, представь вызов функции
Код

foo(object, 0, NULL);

и
Код

foo(object, 0, 0);

в первом случае сразу понятно что третий аргумент указатель.

Добавлено через 3 минуты и 40 секунд
Цитата(Hukuma @  6.11.2009,  14:06 Найти цитируемый пост)
мне просто интересен вопрос переносимости кода, содержащего присваивание указателя на 0 на компилятор С. 

я бы не стал так за это переживать, что значит переносимость в данном случае? Переносимость кода с C++ на C? Нафиг такое нужно? Это совершенно разные языки и никакой переносимости между ними нет и быть не может.

Автор: Hukuma 6.11.2009, 14:12
azesmcar, спасибо большое! Вы правы, первый пример намного нагляднее. Видимо лучше сразу приучусь к NULL smile

Добавлено через 9 минут и 37 секунд
azesmcar, я с вами согласен, что это неправильно переносить код с С++ на С, вопрос скорее более гипотетический, чем практический,
мои коллеги пишут так, а я иначе, хочется добиться единообразия в этом, но при том, чтобы было правильно smile

Автор: Любитель 6.11.2009, 23:47
В С++ - лучше пока 0 ИМХО. NULL - это макрос, ради которого (в отдельных случаях) ещё придётся и лишний инклюд ставить.. А style mix - это точно зло.

Вроде обещали в next-стандарте добавить ключевое слово nullptr. Не знаю, как там сейчас дела обстоят..

Автор: Anikmar 7.11.2009, 00:07
Цитата(Любитель @  6.11.2009,  23:47 Найти цитируемый пост)
В С++ - лучше пока 0 ИМХО. NULL - это макрос, ради которого (в отдельных случаях) ещё придётся и лишний инклюд ставить.. А style mix - это точно зло.

Вроде обещали в next-стандарте добавить ключевое слово nullptr. Не знаю, как там сейчас дела обстоят.. 

Каждый имеет право на свое лево. 0 - это int, а NULL - обозначение нулевого указателя. 
ИМХО в С++ я использую NULL - понятнее и логичнее. ИМХО

Автор: zkv 7.11.2009, 00:23
Любитель, а как насчет null в новом стандарте (в контексте массового перевода программ в новый синтаксис), или как его будут обзывать, не суть? 

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

Автор: Любитель 7.11.2009, 01:15
Цитата(Anikmar @  7.11.2009,  00:07 Найти цитируемый пост)
Каждый имеет право на свое лево. 0 - это int, а NULL - обозначение нулевого указателя. 

Ээ.. это ваше мнение. 0 - это не int smile

Добавлено через 17 секунд
Цитата(zkv @  7.11.2009,  00:23 Найти цитируемый пост)
Любитель, а как насчет null в новом стандарте (в контексте массового перевода программ в новый синтаксис), или как его будут обзывать, не суть? 

Не понял вопроса.

Автор: Anikmar 7.11.2009, 01:31
Цитата(Любитель @  7.11.2009,  01:15 Найти цитируемый пост)
Ээ.. это ваше мнение. 0 - это не int 

Согласен, что 0 не совсем int, но давайте рассмотрим стандартные  преобразования. Когда 0 - это не int без принудительного преобраззования? 

Автор: andrew_121 7.11.2009, 01:35
Цитата(Любитель @  6.11.2009,  23:47 Найти цитируемый пост)
Вроде обещали в next-стандарте добавить ключевое слово nullptr. Не знаю, как там сейчас дела обстоят.. 

Еще нет :(

Добавлено через 3 минуты и 42 секунды
ЛюбительAnikmar, По сути, мало кто вникает в детали NULL и 0. azesmcar Процитировал все что должен знать каждый С++ прогер.

Сам использую NULL для указателей, и 0 для целых.

Автор: Anikmar 7.11.2009, 01:44
Цитата(andrew_121 @  7.11.2009,  01:35 Найти цитируемый пост)
По сути, мало кто вникает в детали NULL и 0

Просветите меня в те детали, в которые я не вник, пожалуйста...

Автор: zkv 7.11.2009, 01:47
Любитель, по контексту обсуждения похоже, ключевое слово называется 
Цитата(andrew_121 @  7.11.2009,  01:35 Найти цитируемый пост)
nullptr
.

Множество исходников на сегодняшний день написано как со словом NULL вместо нулевого указателя на, так и с 0 вместо него.
Первый понятно как перебить - достаточно замены макроопределения в проекте, а как быть со вторым? (в этом состоял мой вопрос)

Автор: Любитель 7.11.2009, 02:08
Если честно - не знаю, надо читать. Но решения с первым - костыль. Причём (объективно) ужасный. Быть может будет работать и 0, но вот nullptr в контексте числа нельзя будет использовать. А быть может вообще на это предложение забили smile Просто я не слежу за С++ уже давно..

Добавлено через 2 минуты и 27 секунд
Цитата(Anikmar @  7.11.2009,  01:31 Найти цитируемый пост)
Когда 0 - это не int без принудительного преобраззования?  

Блин, когда используется в контексте любого указателя. Без explicit-кастинга. Конкретные линки на стандарт, думаю, не нужны? smile 

[полуоффтоп]
Кстати, кутешный кодестайл не рекомендует использовать NULL smile 
[/полуоффтоп]

Автор: Anikmar 7.11.2009, 02:28
Цитата(Любитель @  7.11.2009,  02:08 Найти цитируемый пост)
Блин, когда используется в контексте любого указателя. Без explicit-кастинга. Конкретные линки на стандарт, думаю, не нужны?  

Если честно, уже сам сомневаюсь, но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * .
Если 0 используется в контексте указателя разве там не идет преобразование int->void* ?

Автор: zkv 7.11.2009, 02:33
Цитата(Любитель @  7.11.2009,  02:08 Найти цитируемый пост)
Кстати, кутешный кодестайл не рекомендует использовать NULL

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

Автор: mes 7.11.2009, 11:39
Цитата(Anikmar @  7.11.2009,  01:28 Найти цитируемый пост)
Если честно, уже сам сомневаюсь, но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * .
Если 0 используется в контексте указателя разве там не идет преобразование int->void* ? 

а "1 " должен соблюдат
Цитата(Anikmar @  7.11.2009,  01:28 Найти цитируемый пост)
но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * .

это Вы про C++ ? тогда
1. Чем в таком случае  "1" отличается от "0" ?
2. Почему (в Cpp) не работает конструкция : int * i = (int)(void*) 1;

smile

Добавлено через 4 минуты и 24 секунды
Цитата(zkv @  7.11.2009,  01:33 Найти цитируемый пост)
ой, мозоль уже набили, да накакать на троллей, как и на гугл, как и на мотороллу, если они неправы. 

 smile 
всегда надо обдумывать почему введено то и другое правило ?
Зачастую эти ограничения приводят к некоторой ущербности, но делают это для того, чтоб  так называемо "облегчить" жизнь программисту.
имхо, одна из причин, чтоб не было проблем со стыковкой с неграмотно написанным кодом, как например в случае с констанстностью.
Проще ведь запретить использовать, чем научить использовать правильно smile
 smile 

Автор: Любитель 7.11.2009, 11:47
Цитата(Anikmar @  7.11.2009,  02:28 Найти цитируемый пост)
Если 0 используется в контексте указателя разве там не идет преобразование int->void* ? 

Ну.. что значит преобразование. Если 0 используется в контексте любого указателя плюсовый компилятор обязан его интерпретировать как нулевой указатель нужного типа.

Цитата(zkv @  7.11.2009,  02:33 Найти цитируемый пост)
ой, мозоль уже набили, да накакать на троллей, как и на гугл, как и на мотороллу, если они неправы. 
Не верьте никому, выбирайте правильные ориентиры. 
Я никогда не признаю моторолловские "не используйте пространства имен", гугловские и троллтечные регистры имен файлов, когда дело касается имен классов в них содержащихся, про исключения вообще молчу. 

Ну, я ж написал, что "полуофтоп". Вроде и по теме - но никому ничего этим доказать я само собой не собирался (ибо да, я понимаю, по большому счёту это не аргумент).

Лично моё предпочтение к 0 вместо NULL обуславливается двумя причинам:
1. Субъективная: меня раздражают идентификаторы в стиле ALL_IN_UPPER_CASE smile 
2. Объективная (хотя и не столь уж важная): если у нас есть хидер класса, которому (с точки зрения простой логики) не нужны никакие инклюды, мы хотим указать значение по умолчанию в качестве нулевого указателя в каком-либо методе, то.. Для NULL придётся добавить инклюд на cstddef/stddef.h.

Добавлено через 1 минуту и 29 секунд
mes, перечитал два раза твой пост - и так не понял, на какой ты "стороне"? smile

Автор: MAKCim 7.11.2009, 11:56
Цитата(Любитель @  7.11.2009,  01:15 Найти цитируемый пост)
Ээ.. это ваше мнение. 0 - это не int

таки int ;)
Код

#include <iostream>
#include <cstddef>

int main()
{
    std::cout<<sizeof(short)<<", "<<sizeof(typeof(0))<<", "<<sizeof(typeof(NULL))<<std::endl;
    return 0;
}

2, 4, 8 
на моем core2duo, x86_64, gcc 4.3.2

Добавлено через 4 минуты и 54 секунды
Цитата(Любитель @  7.11.2009,  11:47 Найти цитируемый пост)
Если 0 используется в контексте любого указателя плюсовый компилятор обязан его интерпретировать как нулевой указатель нужного типа.

возможно это в стандарте, но это + к списку граблей с т. з. грамматики языка
и к тому же нелогично
0 - это целое число, а множество значений адресов, формально говоря, не является надмножеством целых чисел ;)

Автор: Любитель 7.11.2009, 12:37
Цитата(MAKCim @  7.11.2009,  11:56 Найти цитируемый пост)
таки int ;)

0 - это нечто страшное smile И его тип определяется по контексту использования.

Цитата(MAKCim @  7.11.2009,  11:56 Найти цитируемый пост)
возможно это в стандарте, но это + к списку граблей с т. з. грамматики языка
и к тому же нелогично
0 - это целое число, а множество значений адресов, формально говоря, не является надмножеством целых чисел ;) 

Да, это косяк стандарта, на мой взгляд. Именно потому было предложение про nullptr. Текущие решения ИМХО оба костыльны. Впрочем, целые числа и логический тип (по идее) тоже не должны пересекаться - в С++ здесь лучше (чем в С - впрочем для С это как раз не минус, ибо другой уровень, другое мышление), новполне возможен неявный кастинг..

Да-да, полтора года работы на шарпе дают о себе знать...

Автор: MAKCim 7.11.2009, 13:07
Цитата(Любитель @  7.11.2009,  12:37 Найти цитируемый пост)
в С++ здесь лучше

в обычном (ansi) C bool'а нет, так что что там будет пдразумеваться под bool зависит от программиста ;)

Автор: Любитель 7.11.2009, 13:17
Да, я знаю. И это плохо smile 
В С++ же он есть - и это хорошо.
    Но неявный кастинг из чисел - это плохо smile

Автор: MAKCim 7.11.2009, 13:26
Цитата(Любитель @  7.11.2009,  13:17 Найти цитируемый пост)
Но неявный кастинг из чисел - это плохо

ничего не каститься, возвращается int
а вот семантика if (...) и аналогов использует значения 0 и не 0
и это абсолютно независимые вещи ;)
а вот в C++ идет как раз каст в bool 

Автор: Любитель 7.11.2009, 13:31
Ээ.. ну я и говорю про С++.

Цитата(Любитель @  7.11.2009,  13:17 Найти цитируемый пост)
Да, я знаю. И это плохо smile

Это речь про С.

Цитата(Любитель @  7.11.2009,  13:17 Найти цитируемый пост)
В С++ же он есть - и это хорошо.

Про С++.

Цитата(Любитель @  7.11.2009,  13:17 Найти цитируемый пост)
Но неявный кастинг из чисел - это плохо smile 

"Но" к последней фразе. Тоже про С++.

Сорри, если неясно выразился smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)