(char)0
使用和'\0'
表示字符数组中的终止空字符有什么区别?
4 回答
它们都是 0,但是(char) 0
是 char,而'\0'
(不直观地)是int
. 如果值为 0,这种类型差异通常不会影响您的程序。
我更喜欢'\0'
,因为这是为此而设计的常数。
字符文字中的反斜杠表示法允许您指定字符的数值而不是使用字符本身。所以'\1'
[*]表示“数值为1的字符”,'\2'
表示“数值为2的字符”,等等。由于 C 的一个怪癖,字符文字实际上具有 type int
,并且确实int
也用于处理其他上下文中的字符,例如fgetc
. So'\1'
表示“数值为 1 的字符的 int 数值”,依此类推。
由于字符在 C中是数值,因此“数值为 1 的字符”实际上是 (char)1
,并且额外的修饰'\1'
对编译器没有影响 -与 C'\1'
中的类型和值相同1
。因此反斜杠符号在 C 中更需要字符串文字而不是字符文字,用于插入没有自己的转义码的不可打印字符。
就个人而言,我更喜欢0
在我的意思是 0 的时候写,让隐式转换来做他们的事情。有些人觉得这很难理解。与这些人一起工作时,'\0'
当你的意思是一个值为 0 的字符时,编写它会很有帮助,也就是说,在你期望你0
很快会隐式转换为char
类型的情况下。NULL
类似地,当你指的是一个空指针常量,当你指的是一个值为 0 的双精度数时,它会有所帮助0.0
,依此类推。
它是否对编译器有任何影响,以及是否需要强制转换,取决于上下文。由于'\0'
具有与 完全相同的类型和值0
,因此需要char
在完全相同的情况下强制转换为。因此'\0'
,(char)0
类型不同,对于完全等效的表达式,您可以考虑(char)'\0'
vs(char)0
或'\0'
vs 0
。NULL
具有实现定义的类型——有时它需要转换为指针类型,因为它可能具有整数类型。0.0
有类型double
,所以肯定是不同的0
。仍然,float f = 1.0;
与float f = 1;
and相同float f = 1.0f
,而int 的1.0 / i
wherei
通常与 具有不同的值1 / i
。
因此,无论是使用'\0'
还是0
纯粹为了方便您的代码读者,任何一般规则 - 对编译器都是一样的。选择您(和您的同事)喜欢的外观,或者定义一个宏ASCII_NUL
。
[*] 或'\01'
- 由于反斜杠引入的是八进制数,而不是十进制数,因此有时明智的做法是确保它以 0 开头,使其更加明显。当然,对于 0、1、2 没有区别。我说“有时”,因为反斜杠后面只能跟 3 个八进制数字,所以不能写\0101
代替\101
,以提醒读者这是一个八进制值。这一切都非常尴尬,并导致更多的装饰:\x41
对于大写字母 A,因此如果您愿意,您可以写'\x0'
为 0。
零在 C 中可能意味着很多不同的东西。您应该使用空字符 '\0',因为这样就不会混淆您的意图是字符串终止。
如果将 char 设置为 0,这可能意味着 null 终止,但也可能意味着您只是将 char 用作 8 位整数进行计算,而不是作为字符串的一部分。如果您还在同一代码中使用指针并将它们与零进行比较,这可能会进一步混淆,这就是一个空指针。
字符数组意味着您正在使用字符串,因此我建议您'\0'
在读取用户的所有字符后在字符数组的末尾使用,因为0
它是简单的字符,但'\0'
它NULL
表示字符串的结尾。