簡體   English   中英

(char)0和'\\ 0'有什么區別? 在C

[英]What is the difference between (char)0 and '\0'? in C

使用(char)0'\\0'表示字符數組中的終止空字符有什么區別?

它們都是0,但(char) 0是char,而'\\0'是(直覺上) int 如果值為0,則這種類型差異通常不應影響您的程序。

我更喜歡'\\0' ,因為那是用於此的常量。

字符文字中的反斜杠符號使您可以指定字符的數值,而不是使用字符本身。 因此'\\1' [*]表示“數值為1的字符”, '\\2'表示“數值為2的字符”,等等。 由於C的怪異,字符字面量實際上具有int類型,實際上int也用於處理其他上下文中的字符,例如fgetc的返回值。 因此, '\\1'表示“數值為1的字符的int數值”,依此類推。

由於字符在C中數字值,因此“數字值為1的字符”實際上 (char)1 ,並且'\\1'的多余修飾對編譯器沒有影響- '\\1'具有相同的類型和值在C中為1因此,在字符串文字中比在字符文字中更需要反斜杠符號,以插入沒有自己的轉義碼的不可打印字符。

就我個人而言,我更喜歡在我表示0時寫0 ,然后讓隱式轉換完成任務。 有些人很難理解。 與這些人一起工作時,在您指的是值0的字符時寫'\\0'很有幫助,也就是說,在您期望0即將隱式轉換為char類型的情況下。 同樣,當您指的是空指針常量時,寫NULL會有所幫助;當您指的是值0的double時,寫0.0會有所幫助,依此類推。

它對編譯器是否有影響,是否需要強制轉換取決於上下文。 由於'\\0'具有完全相同的類型和價值為0 ,它需要被轉換為char在完全相同的情況下。 所以'\\0'(char)0的類型不同,對於完全等效的表達式,您可以考慮(char)'\\0' 0'vs (char)0 ,或者'\\0' 0'vs 0 NULL具有實現定義的類型-有時需要將其強制轉換為指針類型,因為它可能具有整數類型。 0.0具有double類型,因此肯定不同於0 不過, float 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來提醒讀者它是一個八進制值。 一切都很尷尬,並導致更多的修飾: \\x41表示大寫\\x41 A,因此,如果需要,您可以將'\\x0'為0。

零在C中可能意味着很多不同。您應該使用空字符'\\ 0',因為這樣就不會混淆您的意圖是字符串終止。

如果將char設置為0,則表示終止為空,但這也意味着您只是將char作為8位整數用於計算,而不是作為字符串的一部分使用。 如果您還在同一代碼中使用指針並將它們與零(即零指針)進行比較,則可能會進一步混淆。

字符數組表示您正在使用字符串,因此我建議您從用戶讀取所有字符后,在字符數組的末尾使用'\\0' ,因為0是簡單字符,但'\\0'NULL則表示字符串結尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM