Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NULL или 0? 
V
    Опции темы
Hukuma
Дата 6.11.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет




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

Код

int *ptr=0


и 

Код

int *ptr=NULL


разные вещи?

PM MAIL   Вверх
Anikmar
Дата 6.11.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Надо писать NULL.
PM MAIL ICQ   Вверх
Hukuma
Дата 6.11.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Anikmar, вы знаете из личного опыта? Я не прошу доказательств или убеждений, мне просто интересен вопрос переносимости кода, содержащего присваивание указателя на 0 на компилятор С.
PM MAIL   Вверх
azesmcar
Дата 6.11.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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? Нафиг такое нужно? Это совершенно разные языки и никакой переносимости между ними нет и быть не может.
PM   Вверх
Hukuma
Дата 6.11.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



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

Добавлено через 9 минут и 37 секунд
azesmcar, я с вами согласен, что это неправильно переносить код с С++ на С, вопрос скорее более гипотетический, чем практический,
мои коллеги пишут так, а я иначе, хочется добиться единообразия в этом, но при том, чтобы было правильно smile
PM MAIL   Вверх
Любитель
Дата 6.11.2009, 23:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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

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


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 7.11.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

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

Каждый имеет право на свое лево. 0 - это int, а NULL - обозначение нулевого указателя. 
ИМХО в С++ я использую NULL - понятнее и логичнее. ИМХО
PM MAIL ICQ   Вверх
zkv
Дата 7.11.2009, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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

По теме. Называй как хочешь, часто описывается в стандарте твоей компании.
Для себя предпочитаю употреблять NULL, только для того, чтобы визуально легче было, в коде, отличать инициализацию указателя.
PM MAIL   Вверх
Любитель
Дата 7.11.2009, 01:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 7.11.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

Согласен, что 0 не совсем int, но давайте рассмотрим стандартные  преобразования. Когда 0 - это не int без принудительного преобраззования? 
PM MAIL ICQ   Вверх
andrew_121
Дата 7.11.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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

Еще нет :(

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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Anikmar
Дата 7.11.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

Просветите меня в те детали, в которые я не вник, пожалуйста...
PM MAIL ICQ   Вверх
zkv
Дата 7.11.2009, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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

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

PM MAIL   Вверх
Любитель
Дата 7.11.2009, 02:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 7.11.2009, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

Если честно, уже сам сомневаюсь, но цифра 0 вроде всегда считалась int, а потом приводилась к типу void * .
Если 0 используется в контексте указателя разве там не идет преобразование int->void* ?
PM MAIL ICQ   Вверх
zkv
Дата 7.11.2009, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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

ой, мозоль уже набили, да накакать на троллей, как и на гугл, как и на мотороллу, если они неправы. 
Не верьте никому, выбирайте правильные ориентиры. 
Я никогда не признаю моторолловские "не используйте пространства имен", гугловские и троллтечные регистры имен файлов, когда дело касается имен классов в них содержащихся, про исключения вообще молчу.
PM MAIL   Вверх
mes
Дата 7.11.2009, 11:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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 



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 7.11.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(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


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 7.11.2009, 11:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Любитель @  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 - это целое число, а множество значений адресов, формально говоря, не является надмножеством целых чисел ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Любитель
Дата 7.11.2009, 12:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(MAKCim @  7.11.2009,  11:56 Найти цитируемый пост)
таки int ;)

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

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 7.11.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Любитель
Дата 7.11.2009, 13:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 7.11.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Любитель
Дата 7.11.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Ээ.. ну я и говорю про С++.

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

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

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

Про С++.

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.