C 11標準之NULL與nullptr比較

2021-09-11 02:24:59 字數 925 閱讀 8171

隨著c++11

標準的出現,

c++的規範也越來越嚴謹,在減少語言二義性上,

c++委員會確實做了很多努力。

在過去,我們如果要表示乙個指標為空,我們條件反射肯定會這麼寫:

int *p = null;

然而啊,有沒有想過這是有問題的,比如下面的這段**:

#include

#include

using namespace std;

void func(int* num)

void func(int num)

void main(int argc, char** ar**)

程式會輸出什麼?很多人的回答是:輸出

this is the ptr function

…啊。其實啊,這裡輸出的是:

其實啊,在編譯器進行解釋程式時,

null

會被直接解釋成

0,所以這裡的引數根本就不是大家所想的

null

,引數已經被編譯器偷偷換成了0,

0是整數啊,所以呼叫的是第二個函式。所以一些程式設計大師也建議將

null換成0

,這樣可以減少後期維護的困難。但是我要怎麼呼叫第乙個函式呢?網上有很多解決辦法(大多是利用之前的標準寫的)。

c++11

的出現徹底解決了這個問題,

nullptr

在c++11

中就是代表空指標,不能被轉換成數字(具體底層是怎麼實現的,大家可以看看

api),這次再試試,輸出的結果如下圖:

c 11中nullptr(與NULL的區別)

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

C 11新標準之五 constexpr

常量表示式必須在編譯期間計算出它的值並且 它的值不可以被改變。在c 11中,我們可以通過宣告constexpr讓編譯器確定乙個變數是不是常量表示式,宣告為constexpr的變數是const型別的變數,它必須由常量表示式來初始化。例如 cpp view plain copy constexpr in...

C 11新標準之範圍for語句

說起for語句,我們都不會陌生,因為在迴圈中經常會用for語句來遍歷一些陣列什麼的,就形如以下的for迴圈,是我們最常見的 for int i 0 i 5 i 範圍for語句可以遍歷容器或者其他序列的所有元素。以下用乙個小小的 測試片段說明一下這個新特性的使用方法 傳統寫法,遍歷每個string型別...