C中為什麼要儘量使用0而不是NULL

2021-03-05 09:13:54 字數 5327 閱讀 5244

1樓:哎呀

你們老師這樣對你說的麼?然後想告訴你,c++最新的規範中(2023年的,也叫c++11)的說法是,null是標準的,但是相容以前的以0等價於空值的寫法。

所以,標準的寫法是null,而不是0。

但是,要在心中建立起這樣的概念,c++程式設計中,所有的資料對電腦來說,都是2進位制的數,無論是數值、字元、圖象,最終電腦能認識的,只是一串串的二進位制的數,如果進一步的去說,電腦只是認2進位制數代表的一個個開關。

所以0在某些條件下,就是null,就是空。null在轉化成其它數值時,也就是0。

此外,各種程式設計環境中,對c++的規範是有一定的差別的,比如vs中的c++,與dev-c中的c++就有一些細節上的不同,並不是在vs中能編譯通過的,在dev中就也能。c++builder中差別就更大了。

2樓:

實質上在c++裡null就是0,只不過是null是巨集定義,效能方面並沒有多大的影響。有些人喜歡直接寫0是因為躍過了巨集替換這麼一個過程。

null的原型定義請看這個連結

c++中為什麼要儘可能使用0而不是null

3樓:匿名使用者

來自網上,僅供學習交流。

首先呢,要明白一點兒,null是一個無型別的東西,而且是一個巨集。而巨集這個東西,從c++誕生開始,就是c++之父嗤之以鼻的東西,他推崇儘量避免巨集。而在他的faq中,也有相應的一個關於null與0的解釋,也談到了這一點兒。

stroustrup: c++ style and technique

在c++標準中,我們可以見到一個詞語叫做null pointer constant,其實在c++11標準前,是隻承認0為null pointer constant的。所以,在c++中,我們也經常能聽到一個說法,就是賦予null pointer,應該是使用0,而非null。而nullptr pointer constant這個詞語在c++11釋出後,終於再添了一個成員,就是nullptr。

而與null本質不同的是,nullptr是有型別的(放了在stddef標頭檔案中),型別是 typdef decltype(nullptr) nullptr_t; 而正是因為是有型別的,這給我們編譯器實現nullptr的時候帶來了更多細節的考慮,當然也給了使用者更多的保障,所以如果你的編譯器支援nullptr,請一定使用nullptr!

而nullptr的出現背景,其實是很簡單的,c++哲學上來說就是c++之父一直對null pointer沒有一個正式的表示感到非常不滿,而更工程的來說,就是關於過載這個問題。

void f(void*)

void f(int)

int main()

而引入了nullptr,這個問題就得到了真正解決,會很順利的調到void f(void*)這個版本。

好了,真的以為nullptr就這樣了麼? 我前面說過了nullptr是有型別的,叫做nullptr_t,這給我們編譯器實現帶來了諸多要考慮的東西,不幸的話讓我們來舉點兒奇葩例子吧!

union u

;int main()

那麼這是應該符合union語意還是nullptr的語意呢?這在標準中是沒有說的,我們也為此爭論了非常久。當然在我們編譯器的實現還是保持了nullptr的語意,結果是0。

而nullptr有型別後,還能做什麼呢?那當然就是可以捕獲異常了。

int main()

catch(nullptr_t) }

你扔一個null試試?看他應該用什麼收,正是因為沒有型別,所以就要用它的本質型別,比如long什麼的來說。你扔一個0試試?

那就也不是所謂的空指標型別了,就是要用int什麼的來收了。

所以,推崇nullptr是有道理的,我們在編譯器實現nullptr的時候考慮了非常非常多的細節,還有很多你們可能一直用不到的情況,我們都要用來測試,目的就是保障開發者的使用。再次那句話,如果你的編譯器支援nullptr,請一定使用nullptr!

最後再扯一點兒,0在c++是很神奇的東西。比如純虛擬函式為什麼是用=0來設定的,不知道有沒有同學去考慮過這個問題沒有。如果你深刻理解了c++哲學,這應該就是非常簡答的問題了。

學語言嘛,一定要學到其哲學,你才能知道其之美,其之威力,尤其是c++。

4樓:匿名使用者

null是vs裡的巨集(#define null 0),所以在vs裡其實沒有區別。但如果**需要移植,使用其他編譯器,如果沒有null的巨集定義就會報錯。

c++中為什麼要儘可能使用0而不是null

5樓:一直很少提問的

???沒看懂什麼意思,0是指值為0,而null表示物件為空。

比如說,你宣告一個物件

classa a;//classa是你自己建立的一個類。

這個a 並沒有例項化,那麼這個a就為null了。

6樓:

c語言應該是的其它語言就不一定了,有的表示不確定

c++裡如何使用null

7樓:匿名使用者

在baic++裡,null和0是通用的。(dunull本身是一個巨集:zhi#define null 0)

所以和0的用dao法是一樣的內。例如:容

int *p = null;

int *q = 0; // 和 int *q = null 一樣char *str = null;等等。

8樓:匿名使用者

在抄stdio.h中是這

bai樣定du

義的zhi:dao

#ifndef null

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)#endif

#endif

c++中「null」和「0」的區別是什麼?

9樓:若葉七夜西

0是一個數字,本身有著一些原生的特性諸如:起始,沒有,正負的分界線,0/1中的0還可以表示否定。0可以表示數字0,也可以表示ascii碼值為0的字元。

null用於將指標指定為空指標,也就是說該指標不指向任何物件,不可以對該指標進行解引用,否則系統會報錯。

在數值上null,'\0',0是一樣的,都是0,但'0'就不同了,在ascii碼中編碼為48,所以字元0和上述三個值不同。

什麼是 null?

[6.3.2.

3-footnote] the macro null is defined in (and other headers) as a null pointer constant

即 null 是一個標準規定的巨集定義,用來表示空指標常量。因此,除了上面的各種賦值方式之外,還可以用 p = null; 來使 p 成為一個空指標。

指標的概念

指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。

malloc 函式在分配記憶體失敗時返回 0 還是 null?

malloc 函式是標準 c 規定的庫函式。在標準中明確規定了在其記憶體分配失敗時返回的是一個 「null pointer」(空指標):

[7.20.3-1] if the space cannot be allocated, a null pointer is returned.

對於空指標值,一般的文件(比如 man)中傾向於用 null 表示,而沒有直接說成 0。但是我們應該清楚:對於指標型別來說,返回 null 和 返回 0 是完全等價的,因為 null 和 0 都表示 「null pointer」(空指標)。

『\0』:『\0』是一個「空字元」常量,它表示一個字串的結束,它的ascii碼值為0。注意它與空格' '(ascii碼值為32)及'0'(ascii碼值為48)不一樣的。

在c/c++中,當要給一個字串新增結束標誌時,都應該用『\0』而不是null或0。

當我們要置一個指標為空時,應該用null,當我們要給一個字串新增結束標誌時,應該用『\0』。

請問誰知道c++中 null 和 0 的區別? 具體點的,謝謝了~~

10樓:若葉七夜西

0是一個數字,本身有著一些原生的特性諸如:起始,沒有,正負的分界線,0/1中的0還可以表示否定。0可以表示數字0,也可以表示ascii碼值為0的字元。

null用於將指標指定為空指標,也就是說該指標不指向任何物件,不可以對該指標進行解引用,否則系統會報錯。

在數值上null,'\0',0是一樣的,都是0,但'0'就不同了,在ascii碼中編碼為48,所以字元0和上述三個值不同。

什麼是 null?

[6.3.2.

3-footnote] the macro null is defined in (and other headers) as a null pointer constant

即 null 是一個標準規定的巨集定義,用來表示空指標常量。因此,除了上面的各種賦值方式之外,還可以用 p = null; 來使 p 成為一個空指標。

指標的概念

指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。

malloc 函式在分配記憶體失敗時返回 0 還是 null?

malloc 函式是標準 c 規定的庫函式。在標準中明確規定了在其記憶體分配失敗時返回的是一個 「null pointer」(空指標):

[7.20.3-1] if the space cannot be allocated, a null pointer is returned.

對於空指標值,一般的文件(比如 man)中傾向於用 null 表示,而沒有直接說成 0。但是我們應該清楚:對於指標型別來說,返回 null 和 返回 0 是完全等價的,因為 null 和 0 都表示 「null pointer」(空指標)。

『\0』:『\0』是一個「空字元」常量,它表示一個字串的結束,它的ascii碼值為0。注意它與空格' '(ascii碼值為32)及'0'(ascii碼值為48)不一樣的。

在c/c++中,當要給一個字串新增結束標誌時,都應該用『\0』而不是null或0。

當我們要置一個指標為空時,應該用null,當我們要給一個字串新增結束標誌時,應該用『\0』。

c語言中為什麼a 0不是字元常量?為什麼a 1 a是錯的?a a 1表示什麼

1.你這個 不bai是單字元,是三個字元,嚴格du說你這個是zhi一個字串,你dao這個是一個值,左邊沒有常回量名 2.賦值答號的左邊不能是表示式,只能是變數,這個不管是什麼語言都是這樣規定的 3.a a 1,應該是先a a a,然後a a 1 a 看到了嗎?這個是字元常量,你那個是字串常量 c中字...

c語言二維陣列,這裡為什麼a的值是1,不是0嗎

a 2 3 相當於a 0 0 1 a 0 1 0 a 0 2 0 a 1 0 4 a 1 1 5 a 1 2 0 c語言中二維陣列的a代表是0行首地址,那 a不就是首個元素嗎,為什麼 a代表的還是首個元素的地址 哈哈!以下標從0開始說。若a是二維陣列名,則a作常指標使用時,a是第0行的指標,a是第0...

餐館為什麼還使用木筷子,而不是可清洗 循壞再用的?

其實是顧客 消費者 有這種需求或要求,一句話 商家的行為都是為滿足消費者需求而設的,或者為了創造消費者使用一次性筷子的需求而定的。簡單分析一下 是前者還是後者呢?在下認為,結果可能得分情況而定。1.因為普通餐館的一次性筷子,顧客是免費使用的,餐館老闆是會想著減少成本同時老闆自己也會計算是清洗迴圈利用...