В чем разница между NULL в C ++ и null в Java? - PullRequest
19 голосов
/ 02 июня 2010

Я пытался понять, почему C ++ сводит меня с ума, набирая NULL. Внезапно это поражает меня на днях; Я набираю null (строчные буквы) на Java в течение многих лет. Теперь я вдруг программирую на C ++, и этот маленький кусок мышечной памяти сводит меня с ума.

Wikiperipatetic определяет C ++ NULL как часть stddef:

Макрос, который расширяется до нулевого указателя постоянная. Это может быть определено как ((void *) 0), 0 или 0L в зависимости от Компилятор и язык.

Документация Sun говорит мне об «нулевом литерале» Java:

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

Так что все это очень мило. Я знаю, что такое ссылка на нулевой указатель, и спасибо за примечания компилятора. Теперь я немного размышляю над идеей литерала в Java, поэтому я продолжаю читать ...

Литерал - это исходный код представление фиксированного значения; литералы представлены непосредственно в ваш код без необходимости вычисление.

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

Хорошо, так что я думаю, я понял это сейчас. В C ++ NULL - это макрос, который при компиляции оценивается как константа нулевого указателя. В Java null - это фиксированное значение, которое может быть назначено любому не примитиву; отлично подходит для тестирования в удобном if statement.

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

Кроме того, я что-то здесь упускаю?

Ответы [ 10 ]

24 голосов
/ 02 июня 2010
  • NULL - это идентификатор директивы препроцессора , в соответствии с соглашением это должны быть все заглавные буквы.

  • null - это язык буквальный , представляющий постоянное значение и должен в соответствии с соглашением быть все ниже (как true или false).

21 голосов
/ 02 июня 2010

NULL в Java больше похож на nullptr в C ++ 0x. Значение NULL в C ++ равно 0 и может закончиться преобразованием в int, а не в указатель, как вы бы хотели. Рассмотрим:


void f(int);
void f(char*);

...

f(NULL); // which f()?

В C ++ 0x есть nullptr, который решает эту проблему, но все равно не будет полностью эквивалентен нулю в Java. Это просто разные языки.

Да, и еще одна разница в том, что у Java нет указателей (или так сказано). В Java вы можете на законных основаниях присваивать нулю ссылку, в C ++ вы не можете сделать это, не использовав плохо сформированную конструкцию. По общему признанию, Java был бы почти бесполезен без этой способности, но это определенно другое важное отличие.

6 голосов
/ 02 июня 2010

Относительно вашего последнего вопроса, я не уверен, что обоснование дизайна стоит за строчными нулями, но я думаю, что цель состояла в том, чтобы сделать null буквальным на уровне языка (вроде true или false), а не константой.

Ключевые слова в Java обычно имеют нижний регистр и поэтому называются литералами. Константы (например, Integer.MAX_VALUE) обычно пишутся в верхнем регистре.

2 голосов
/ 02 июня 2010

Ключевое слово Java null используется для определения переменной как не ссылающейся на какой-либо объект. Ключевое слово null нельзя назначить переменной, объявленной с примитивным типом данных. Значение C ++ NULL является константой, определенной как 0.

2 голосов
/ 02 июня 2010

Нет, вы в значительной степени получили это. В C ++ нулевой указатель - это любое буквальное нулевое значение, назначенное указателю. NULL - это просто макрос для 0, поэтому ptr = 0 и ptr = NULL идентичны. Это включено только для удобства / читабельности. Причина в том, что это прописные буквы, потому что в C и C ++ существует давнее соглашение, что имена макросов должны быть прописными.

В Java null является встроенным литералом, и, поскольку он не является макросом (и в любом случае Java не имеет понятия о макросе), нет веских причин делать его прописными.

2 голосов
/ 02 июня 2010

Используйте 0 вместо NULL.

Из книги "Язык программирования C ++", создатель языка Бьярн Страуструп:

В Си было популярно определять макрос NULL для представления нулевого указателя. Потому что Более строгая проверка типов в C ++, использование простого 0 вместо любого предлагаемого макроса NULL, приводит к меньшему количеству проблем. Если вы чувствуете, что должны определить NULL, используйте const int NULL = 0;

1 голос
/ 02 июня 2010

В Java нет указателей, как вы сказали сами, поэтому понятие «ноль» совершенно не сравнимо между Java и C ++.

Ваш вопрос имеет такой же смысл, как «в чем разница между углом и яблоком», то есть на него нельзя ответить иначе, кроме очевидного: NULL в C ++ и null в Java два совершенно и совершенно не связанных понятия.

Java никогда не "решила" изменить все заглавные буквы NULL на null, потому что, опять же, Java null не имеет никакого отношения к NULL.

в C ++.
1 голос
/ 02 июня 2010

В C ++ NULL - это макрос, который, когда скомпилировано, определяет нулевой указатель постоянная.

Здесь вы ошиблись. В C ++ NULL равен 0 и больше ничего. И указатели, и целые числа могут быть NULL.

В java, с другой стороны, нулевой указатель является нулевым, то есть только объекты могут быть нулевыми.

0 голосов
/ 02 июня 2010

Указатели - это в основном адреса памяти. И есть только один хорошо известный и установленный адрес памяти, 0. C ++ NULL пишется с большой буквы, потому что это макрос препроцессора, и они всегда пишутся с прописной буквы в соответствии с соглашением. Концепция указателя напрямую связана с концепцией адресного пространства в аппаратном обеспечении.

Java использует ссылки и имеет собственный внутренний способ их представления. Есть одна известная ссылка, нуль. Это в нижнем регистре, потому что это в основном другой символ, хотя и ссылающийся на буквальное значение. Я не думаю, что они «изменили» что-либо с C на Java. Я думаю, что они просто хотели нулевую концепцию, поэтому они назвали ее «нулевой».

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

0 голосов
/ 02 июня 2010

Ну, я не знаю, ПОЧЕМУ java решил изменить NULL на null, однако прописные буквы более проблематичны для ввода (по крайней мере, на мой взгляд). Но вы, вероятно, всегда можете спросить солнце :-P. В любом случае, говорить, что в java нет указателей, не совсем верно, потому что нормальные ссылки в java или c # или подобных случаях больше похожи на указатели, чем ссылки в c ++. Например, в c ++ ссылка не может быть NULL, но ссылка в java может. И ссылка в c ++ не может изменить переменную, на которую она указывает (я могу ошибаться в данный момент), но ссылка java может.

...