![](/img/trans.png)
[英]what is the difference between one length of char*/char[] and char in 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.