Подтвердить что ты не робот

В чем разница между 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?

Кроме того, я что-то пропустил здесь?

4b9b3361

Ответ 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. Я думаю, что они просто хотели нулевую концепцию, поэтому они назвали ее "нулевой".

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