Каково различие между ПУСТЫМ УКАЗАТЕЛЕМ в C++ и пустым указателем в Java?

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

Wikiperipatetic определяет ПУСТОЙ УКАЗАТЕЛЬ C++ как часть stddef:

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

Документы Sun говорят мне это о "пустом литерале Java":

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

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

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

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

Хорошо, таким образом, я думаю, что получаю его теперь. В C++ ПУСТОЙ УКАЗАТЕЛЬ является макросом, который при компиляции оценивает к постоянному нулевому указателю. В Java пустой указатель является фиксированным значением, что любой непримитив может быть присвоен также; большой для тестирования в удобном if statement.

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

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

19
задан Stephano 2 June 2010 в 18:00
поделиться

10 ответов

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


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

...

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

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

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

21
ответ дан 30 November 2019 в 02:16
поделиться

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

2
ответ дан 30 November 2019 в 02:16
поделиться

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

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

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

2
ответ дан 30 November 2019 в 02:16
поделиться
  • NULL - это идентификатор директивы препроцессора , согласно соглашению, все они должны быть заглавными.

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

24
ответ дан 30 November 2019 в 02:16
поделиться

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

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

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

1
ответ дан 30 November 2019 в 02:16
поделиться

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

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

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

0
ответ дан 30 November 2019 в 02:16
поделиться

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

0
ответ дан 30 November 2019 в 02:16
поделиться

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

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

В Java, с другой стороны, null - это нулевой указатель, что означает, что только объекты могут быть нулевыми.

1
ответ дан 30 November 2019 в 02:16
поделиться

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

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

6
ответ дан 30 November 2019 в 02:16
поделиться

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

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

2
ответ дан 30 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: