2011-09-28 219 views

回答

22

字符字面值中的反斜線符號允許您指定字符的數值而不是使用字符本身。所以'\1' [*]表示「數值爲1的字符」,'\2'表示「數值爲2的字符」等。由於C的怪癖,字符文字實際上具有類型int,實際上int也用於處理其他上下文中的字符,例如返回值fgetc。所以'\1'的意思是「數值爲int,數值爲1的字符」等等。

由於字符在C數值,實際上(char)1,並且在'\1'額外裝飾對編譯器沒有影響「其數值爲1的字符」 - '\1'具有相同的類型和值作爲因此在字符串文字中比在字符文字中更需要反斜線符號,用於插入沒有自己的轉義代碼的不可打印字符。

就我個人而言,如果我的意思是0,我更願意寫0,並讓隱式轉換完成它們的工作。有些人覺得很難理解。與這些人一起工作時,如果您的意思是一個值爲0的字符,也就是說您期望0很快將隱式轉換爲char類型,那麼編寫'\0'會很有幫助。同樣,當你的意思是一個空指針常量時,它可以幫助編寫NULL,當你的意思是一個雙精度值爲0的時候,0.0,依此類推。

它是否對編譯器有所不同,以及它是否需要轉換,取決於上下文。由於'\0'0具有完全相同的類型和值,因此需要在相同的情況下將其轉換爲char。所以和(char)0類型不同,對於完全相同的表達式,您可以考慮使用(char)'\0'(char)0'\0'0NULL具有實現定義類型 - 有時需要將其轉換爲指針類型,因爲它可能具有整數類型。 0.0double,所以肯定不同於0float f = 1.0;float f = 1;float f = 1.0f相同,而1.0/i,其中i是int,通常與1/i的值不同。

因此,是否使用'\0'0的任何一般規則純粹是爲了方便您的代碼的讀者 - 這與編譯器完全相同。選擇你(和你的同事)更喜歡的外觀,或者定義一個宏ASCII_NUL

[*]或'\01' - 因爲反斜槓引入了八進制數目,不是小數,它有時明智通過確保它開始於一個0使爲0沒有區別,1使這更明顯一個位,2當然。我會說「有時」,因爲反斜槓只能跟着3個八進制數字,所以你不能寫\0101而不是\101,提醒讀者它是一個八進制值。這是非常尷尬的,並導致更多的裝飾:大寫A的\x41,因此如果需要,您可以將'\x0'寫爲0。

25

它們都是0,但是(char) 0是字符,而'\0'是(不直覺)是int。如果值爲0,則此類型差異通常不會影響您的程序。

我更喜歡'\0',因爲這是爲此設計的常數。

+0

我agreen - 當你訴諸鑄造,我認爲你應該至少有另一個思考問題。爲什麼把蘋果和橘子比較? –

+7

他不應該施放。我相信'char c = 0;'是合法的,並且它在gcc上用'-Wettra -pedantic'編譯。我只是覺得''0''更好地表達了這個意圖。 –

+0

我截斷了一個字符串作爲我的代碼的一部分。因此,在我必須結束的部分添加空字符時,我對於哪種表示效果更好感到困惑。 – Sathya

2

零在C中可能意味着很多不同的東西。您應該使用空字符'\ 0',因爲那樣您就不會意識到您的意圖是字符串終止。

如果將char設置爲0,那可以表示空終止,但這也意味着您只是將char用作計算的8位整數,而不是字符串的一部分。 如果您也在相同的代碼中使用指針,並將它們與0進行比較,然後將其作爲空指針,那麼這可能會進一步混淆。

+0

好的,謝謝!那麼我會使用'\ 0'! – Sathya

+0

哎呀,我偶然發現了這個(手指摸不着)。修復它太遲了,但如果您進行編輯,我可以刪除downvote。 –

+0

呃好吧...隨機編輯。 – Lundin

-1

字符數組意味着你正在服用的字符串,所以我建議你在字符數組的末尾讀取來自用戶,因爲0的所有字符後使用'\0'是簡單的人物,但'\0'NULL指示字符串的結尾。

+0

'(char)0'和''\ 0''是相同的值,但'\ 0'是最常用的,因爲這是用於空字符的'char'。 – chema989

相關問題