簡體   English   中英

Java中的NULL和Java中的null有什么區別?

[英]What is the difference between NULL in C++ and null in Java?

我一直試圖弄清楚為什么C ++讓我瘋狂地輸入NULL 前幾天它突然襲擊了我; 多年來我一直在Java中輸入null (小寫)。 現在我突然想用C ++編程,而那一小塊肌肉記憶讓我發瘋。

Wikiperipatetic將C ++ NULL定義為stddef的一部分:

一個擴展為空指針常量的宏。 它可以定義為((void *)0),0或0L,具體取決於編譯器和語言。

Sun的文檔告訴我關於Java的“null literal”:

null類型有一個值,null引用,由文字null表示,由ASCII字符組成。 null文字始終為null類型。

所以這一切都很好。 我知道空指針引用是什么,並感謝編譯器注釋。 現在我對Java中文字的想法有點模糊,所以我繼續閱讀......

文字是固定值的源代碼表示; 文字直接在代碼中表示,無需計算。

還有一個特殊的null文字,可以用作任何引用類型的值。 null可以分配給任何變量,但基本類型的變量除外。 除了測試其存在之外,你幾乎無法使用null值。 因此,null通常在程序中用作標記,以指示某些對象不可用。

好的,所以我想我現在就明白了。 在C ++中,NULL是一個宏,在編譯時,它將計算為空指針常量。 在Java中,null是一個固定值,任何非基元也可以分配; 非常適合在方便的if statement進行測試。

Java沒有指針,所以我可以看出為什么它們保持null是一個簡單的值,而不是任何花哨的東西。 但為什么java決定將所有大寫NULL更改為null

此外,我在這里錯過了什么嗎?

  • NULL預處理程序指令標識符 ,根據慣例,那些應該是全部大寫。

  • null是一個表示常量值的語言文字 ,應該按照慣例全部更低(同樣為truefalse )。

Java的null更像是C ++ 0x的nullptr。 C ++中的NULL只是0,最終可以解析為int而不是像你想要的指針。 考慮:


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

...

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

C ++ 0x有nullptr,它解決了這個問題,但它仍然不會完全等同於Java的null。 他們只是不同的語言。

哦,另一個差異是Java沒有指針(或者它說)。 在Java中,您可以合法地為引用分配null,在C ++中,如果沒有使用格式錯誤的構造,則無法執行此操作。 不可否認,如果沒有這種能力,Java就會毫無用處,但這絕對是另一個重要的區別。

關於你的上一個問題,我不確定小寫null背后的設計原理是什么,但我認為目標是使null成為語言級文字(如真或假)而不是常量。

java中的關鍵字通常是小寫的,因此命名為文字。 常量(如Integer.MAX_VALUE)通常是大寫的。

使用0而不是NULL

來自該語言創建者的“The C ++ Programming Language”一書,Bjarne Stroustrup:

在C中,定義宏NULL來表示零指針已經很普遍。 由於C ++的類型檢查更嚴格,使用plain 0而不是任何建議的NULL宏會導致更少的問題。 如果您覺得必須定義NULL ,請使用const int NULL = 0 ;

不,你已經得到了它。 在C ++中,空指針是分配給指針的任何文字零值。 NULL只是0的宏,因此ptr = 0ptr = NULL是相同的。 它僅用於方便/可讀性。 它是大寫的原因是因為在C和C ++中有一個長期慣例,宏的名稱應該是大寫的。

在Java中, null是一個內置的文字,因為它不是一個宏(並且Java無論如何都沒有宏的概念),所以沒有令人信服的理由將其設為大寫。

Java null關鍵字用於將變量標識為不引用任何對象。 無法將null關鍵字分配給使用基本數據類型聲明的變量。 C ++ NULL值是一個定義為0的常量。

在C ++中,NULL是一個宏,在編譯時定義空指針常量。

這是你弄錯了。 在C ++中,NULL為0,沒有別的。 指針和整數都可以為NULL。

另一方面,在java中,null是一個空指針,這意味着只有對象可以為null。

正如你自己所說,Java沒有指針,這就是為什么“null”的概念在Java和C ++之間是完全無法比擬的。

你的問題與“角度和蘋果之間的區別是什么”一樣有意義,即除了顯而易見之外,它無法以任何其他方式回答:C ++中的NULL和Java中的null是兩個完全無關的概念。

Java從未“決定”將所有大寫NULL更改為null ,因為Java的null再次與C ++的NULL沒有任何關系。

好吧,我不知道為什么java desdes將NULL更改為null,但是大寫更難以輸入(至少在我的考慮中)。 但你可能總是問太陽:-P。 無論如何,說java沒有指針是不完全正確的,因為java或c#中的普通引用或者像c ++中的refferences更像是指針。 例如,在c ++中,引用不能為NULL,但java中的引用可以。 並且c ++中的引用不能改變它指向的變量(我可能在這一點上錯了),但java引用可以。

指針基本上是內存地址。 並且只有一個眾所周知且已建立的內存地址,0。c ++ NULL是大寫的,因為它是一個預處理器宏,它們總是按慣例大寫。 指針概念直接映射到硬件中的地址空間的概念。

Java使用引用,它有自己的內部表示方式。 有一個眾所周知的參考,null。 它是小寫的,因為它基本上是另一個符號,雖然指的是字面值。我不認為它們“改變”了從C到Java的任何東西。 我認為他們只是想要null概念,所以他們稱之為“null”。

在這兩種情況下,null都允許函數返回其他信息。 它可以返回結果的地址以及操作可能不成功的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM