c中為什麼要盡可能使用0而不是

2021-03-05 09:20:27 字數 5208 閱讀 6341

1樓:匿名使用者

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

首先呢,要明白一點兒,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++。

2樓:匿名使用者

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

c++中為什麼要盡量使用0而不是null

3樓:哎呀

你們老師這樣對你說的麼?然後想告訴你,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中差別就更大了。

4樓:

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

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

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

5樓:一直很少提問的

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

比如說,你宣告乙個物件

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

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

6樓:

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

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

7樓:若葉七夜西

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是相等嗎

8樓:宣威朔漠

null是空位址的意思,在使用指標變數時表示乙個空位址,null的值在「stdio.h」標頭檔案中被定義為乙個值為0的符號常量;即

#define null 0 null的值為00可以表示數字0,也可以表示ascii碼值為0的字元「 」表示字串的長度為0的字串。

千萬別把null與0等同起來。

無論c還是c++,null都是乙個implementation-defined的巨集,是實現相關的。null並不就是0,也不就是(void*)0。只不過,大多數編譯器把null定義為0或者(void*)0而已,但並非所有編譯器都這樣做的。

一些常用的**例如if(fpfile = fopen(....) == ....)應該顯式地跟null比較,而不要只寫if(fpfile = fopen(....

)),這是不良**。

9樓:匿名使用者

null通常用來表示指標的 0 值。

10樓:

功能上相等。概念上不等。

c++裡如何使用null?

11樓:太特別

在c++裡,null和bai0是通用的,null本身是一du個巨集:

zhi#define null 0,所以和0的用法是一樣

dao的,例如int *p = null;int *q = 0; // 和 int *q = null 一樣char *str = null;等等。回

知識延展:

null本意是

答「空的」;元素只有「零」的意思,計算機中通常表示空值,無結果,或是空集合。在ascii碼的第乙個字元是null,它的數值是0,占用1位元組,c語言把它作為字串的最後乙個字元,以表示字串到此結束"\0"。

null與0有著扯不斷理還亂的關係,其實不那麼高深,0本身有著一些原生的特性諸如起始,沒有,正負的分界線,0/1中的0還可以表示否定。

null正需要這些特性中的一部分, 我們只需要清楚null的本質,並在合理的地方才加以利用而非濫用。

如何理解c++中的null?

12樓:箬竺

作為一種風格, 很多人不願意在程式中到處出現未加修飾的0。因此定義了預處理巨集null (在和其它幾個標頭檔案中) 為空指標常數, 通常是0 或者((void *)0) 。希望區別整數0 和空指標0 的人可以在需要空指標的地方使用null。

使用null 只是一種風格習慣。預處理器把所有的null 都還原回0, 而編譯還是依照上文的描述處理指標上下文的0。特別是, 在函式呼叫的引數裡, null之前(正如在0 之前) 的型別轉換還是需要。

null 只能用作指標常數。

13樓:匿名使用者

delete t 之後。t為野指標,指向乙個你不能用的記憶體,並非是空指標(null)。

通常delete t後要跟一句t = null; 防止野指標的錯誤使用

delete只是刪除t指向的內容

弦駐波實驗為什麼彈簧振動頻率盡可能避開

減小弦駐波實驗為什麼彈簧振動頻率盡可能避開,偕拓迅芭4687 大學物理實驗思考題 弦線振動的研究 答案啊。跪求高手。急啊 1 支撐處是波節,因為支撐處振幅為0 2 波長變化。改變弦線長時,頻率 波長變化。改變砝碼質量,頻率 波速變化 3 增加砝碼,增加弦長。求弦線上駐波實驗的實驗原理 物理高手請進 ...

在C 中,為什麼1 0 2 0 5,而1 2 0呢

1.0 2表示式中 bai的1.0在c 中預設是浮點型,所du以zhi結果是dao0.5。而1 2表示式都是整型回 的,所以結果是整型的。浮點方式就是答小數點是可以移動的,位置不確定的,而整型int則不是。那為什麼在c 中實型變數在記憶體中的儲存方式為浮點方式,就是實際應用的需要了,不可能什麼資料都...

為什麼cad中宋體字顯示為問號,為什麼我CAD裡面的文字字型選擇仿宋,顯示的全是問號

顯示問號是因為預設的樣式設定問題,修改即可。具體的操作步驟為 1 這是帶問號的字型,單擊它,選擇,然後使用滑鼠右鍵,選擇 功能 輸入修改文字的屬性表,或輸入組合鍵 ctrl 1 2 在輸入屬性表後,這裡要記住三條重要的資訊,一條是頂部的 文字 當然你可能是其他的,無論哪個是你的 然後是 1526 之...