В чем разница между NULL в С++ и null в Java?
Я пытался понять, почему С++ делает меня сумасшедшим, набрав NULL
. Внезапно он бьет меня на днях; Я уже много лет набираю NULL
(нижний регистр) на Java. Теперь я внезапно программирую на С++, и этот маленький кусок мышечной памяти делает меня сумасшедшим.
Wikiperipatetic определяет С++ NULL как часть stddef:
Макрос, который расширяется до нулевого указателя постоянная. Его можно определить как ((void *) 0), 0 или 0L в зависимости от компилятор и язык.
Документы Sun говорят мне о Java "нулевой литерал":
Тип null имеет одно значение, значение null ссылка, представленная буквальным null, который формируется из ASCII персонажи. Нулевой литерал всегда нулевого типа.
Так что все это очень приятно. Я знаю, что такое ссылка на нулевой указатель, и благодарю вас за комментарии к компилятору. Теперь я немного расплывчатый в идее литерала на Java, поэтому я читаю...
Литерал - это исходный код представление фиксированного значения; литералы представлены непосредственно в ваш код, не требуя вычисление.
Также имеется специальный нулевой литерал который может использоваться как ценность для любого ссылочный тип. null может быть присвоен к любой переменной, кроме переменных примитивных типов. Там тебя мало может иметь нулевое значение за пределами тестирование на его присутствие. Следовательно, null часто используется в программах как чтобы указать, что какой-либо объект недоступен.
Хорошо, поэтому я думаю, что я понял это сейчас. В С++ NULL - это макрос, который при компиляции вычисляет константу нулевого указателя. В Java значение null является фиксированным значением, которое может быть присвоено любому не примитиву; отлично подходит для тестирования в удобном if statement
.
Java не имеет указателей, поэтому я могу понять, почему они сохранили нулевое значение, а не что-то интересное. Но почему Java решил изменить все кепки NULL
на NULL
?
Кроме того, я что-то пропустил здесь?
Ответы
Ответ 1
Java null больше похож на С++ 0x nullptr. NULL в С++ - это всего лишь 0 и может в конечном итоге разрешить вместо int, а не указатель, как вы хотите. Рассмотрим:
void f(int);
void f(char*);
...
f(NULL); // which f()?
С++ 0x имеет nullptr, который исправляет эту проблему, но он все равно не будет полностью эквивалентен Java null. Это просто разные языки.
О, и еще один различие заключается в том, что Java не имеет указателей (или так говорит). В Java вы можете законно присваивать значение null ссылке, в С++ вы не можете этого сделать, не используя уже плохо сформированную конструкцию. Разумеется, Java будет рядом с бесполезной без этой способности, но это определенно еще одно важное отличие.
Ответ 2
-
NULL
является идентификатором директивы препроцессора, согласно соглашению, все должны быть закрыты.
-
NULL
является языком litteral, представляющим постоянное значение, и должен в соответствии с соглашением быть все ниже (точно так же, как true
или false
).
Ответ 3
Что касается вашего последнего вопроса, я не уверен, что обоснование дизайна находится за нижним регистром null,
но я думаю, что цель состояла в том, чтобы сделать пустой литерал на уровне языка (например, true или false), а не константу.
Ключевые слова в java, как правило, имеют нижнюю область и так называются литералы. Константы (например, Integer.MAX_VALUE) обычно имеют верхний регистр.
Ответ 4
Используйте 0
вместо NULL
.
Из книги "Язык программирования С++" создателя языка, Бьярн Страуструп:
В C было популярно определять макрос NULL
для представления нулевого указателя. Из-за Более строгая проверка типа С++, использование простого 0
, а не любого предлагаемого макроса NULL
приводит к меньшему количеству проблем. Если вы чувствуете, что вы должны определить NULL
, используйте const int NULL = 0
;
Ответ 5
Нет, у тебя это получилось. В С++ нулевой указатель - это любое буквальное нулевое значение, которое назначается указателю. NULL
- это просто макрос для 0
, и поэтому ptr = 0
и ptr = NULL
идентичны. Он включал только для удобства/удобочитаемости. Причина, по которой это заглавная, состоит в том, что в C и С++ существует давнее соглашение о том, что имена макросов должны быть прописными.
В Java NULL
является встроенным литералом, и поскольку он не является макросом (и Java вообще не имеет понятия о макросе), нет веских причин сделать его заглавным.
Ответ 6
Ключевое слово Java null используется для идентификации переменной как ссылки на какой-либо объект. Ключевое слово null нельзя назначить переменной, объявленной с помощью примитивного типа данных. Значение NULL С++ является константой, которая определяется как 0.
Ответ 7
В С++ NULL - это макрос, который, когда compiled, определяет нулевой указатель константа.
Здесь вы ошибаетесь. В С++ NULL равен 0, и больше ничего. Оба указателя и целые числа могут быть NULL.
В java, с другой стороны, null - это нулевой указатель, что означает, что только объекты могут быть пустыми.
Ответ 8
В Java нет указателей, как вы сказали сами, поэтому концепция "null" совершенно несравнима между Java и С++.
В вашем вопросе так много смысла, как "в чем разница между углом и яблоком", т.е. на него нельзя ответить иначе, кроме очевидного: NULL
в С++ и NULL
в Java две полностью и совершенно не связанные понятия.
Java никогда не "решила" изменить все кепки NULL
на NULL
, потому что еще раз Java NULL
не имеет никакого отношения к С++ NULL
.
Ответ 9
Ну, я не знаю, ПОЧЕМУ java решил изменить NULL на нуль, однако прописная буква более сложна для ввода (по крайней мере, в моем понимании). Но вы, вероятно, всегда можете спросить солнце: -P. В любом случае, если говорить, что java не имеет указателей, это не совсем верно, потому что нормальные ссылки в java или С# или подобных файлах больше похожи на указатели, чем на refferences в С++. Например, в С++ ссылка не может быть NULL, но ссылка в java может. И ссылка в С++ не может изменить, какую переменную она указывает (я могу ошибаться на этом этапе), но ссылка на java может.
Ответ 10
Указатели - это в основном адреса памяти. И есть только один известный и установленный адрес памяти, 0. CULL NULL капитализируется, потому что это макрос препроцессора, и они всегда капитализируются по соглашению. Концепция указателя непосредственно относится к понятию адресного пространства в оборудовании.
Java использует ссылки, и у нее есть собственный внутренний способ их представления. Существует одна известная ссылка, null. Это в нижнем регистре, потому что это в основном другой символ, хотя и ссылающийся на буквальное значение. Я не думаю, что они "изменили" что-либо с C на Java. Я думаю, что они просто хотели нулевую концепцию, поэтому они назвали ее "нулевой".
В обоих случаях нуль позволяет функции возвращать дополнительную информацию. он может вернуть адрес результата и тот факт, что, возможно, операция не увенчалась успехом.