建議1 區分0的4中面孔

2021-07-10 20:12:09 字數 1631 閱讀 4948

0在c/c++語言中有4中形態:

整形0,空指標null,字串結束標記『\0』,和邏輯false/false。

這四種都是有差異的。

它們所佔的記憶體空間:

整形的0佔32位的空間,指標和整形所佔的空間是一樣的。

字元佔空間8位,而邏輯符不太一樣,false是int型別,佔32位,而false是bool型別,佔1位。

#ifndef null

#ifdef _cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

在c語言中,null被強制轉化了一次。

可以看出,在c中,null表示的是指向0的指標,而在c++中,null就直接跟0一樣了。

但有一點值得注意的是:在c語言中,「 當常量0處於應該作為指標使用的上下文中時,它就作為空指標使用 」

int * p=3;

int * p=0;

第一句**就會出錯,而第二句**則不會,說明0在這裡的角色已經不是整形了。

另外

char a[4]=;

//warning: converting to non-pointer type 'char' from null [-wconversion-null]|

這句**會給出警告,這裡的null和』\0』是不一樣的,這是codeblocks環境下的,在別的環境下可能會報錯。

邏輯false的定義和false是不一樣的。

#ifndef false

#define false 0

#endif

#ifndef true

#define true 1

#endif

這裡可以發現,false/true是int型別,而我們用的false/true是bool型別。

這兩個也是有區別的。

其二進位制表示如下:

false -> 0

false -> 00000000 00000000 00000000 00000000

//如果不夠細心,0的多重性可能會讓程式產生一些難以發現的bug,比如:

// 把psrc 指向的源字串複製到pdes 指向的記憶體塊

while(psrc)

//正常情況下,當psrc指向的字元為字串結束符'\0'時,while迴圈終止;但不幸的是,這裡的條件寫錯了,while終止條件變成了psrc指向位址0。結果while迴圈寫入到記憶體中了,直至程式崩潰。

//正確的寫法應該是:

// 把psrc 指向的源字串複製到pdes 指向的記憶體塊中

while(*psrc)

我覺得這個應該是指標問題,不應該歸結於0的誤用。這裡需要指向位址0才會停止迴圈。

//#include

#include

using

namespace

std;

int main()

大家可以看這一段**,不同的0的形態都是不一樣的,指標型別和整形的空間是一樣的。

建議1 區分4中零值

0在c c 語言中絕對是乙個多面手,它扮演著多樣的角色,擁有著多種面孔。總結起來包括以下幾種角色 整型0 空指標null 字串結束標誌 0 邏輯false false,不同的角色適用於不同的情形,下面我們按照上述順序一一介紹。整型0這是我們最熟悉的乙個角色。作為乙個int型別,整型0佔據32位的空間...

ext4分割槽中恢復被刪除的檔案

今天在測試我剛完成的在linux對ntfs分割槽進行備份和恢復的 執行程式備份乙個200m的ntfs分割槽,然後在執行另乙個程式恢復資料到這個200m的分割槽中,然後把這個分割槽載入到 tmp sdd1中檢視,檔案恢復成功 欣喜啊,做了幾個星期,終於可以舒一口氣了!因此,想進一步測試一下,所以想把 ...

ext4分割槽中恢復被刪除的檔案

今天在測試我剛完成的在linux對ntfs分割槽進行備份和恢復的 執行程式備份乙個200m的ntfs分割槽,然後在執行另乙個程式恢復資料到這個200m的分割槽中,然後把這個分割槽載入到 tmp sdd1中檢視,檔案恢復成功 欣喜啊,做了幾個星期,終於可以舒一口氣了!因此,想進一步測試一下,所以想把 ...