使用
(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 的双精度型时,编写
0.0
等等。它是否对编译器有任何影响,以及是否需要强制转换,取决于上下文。由于
'\0'
与
0
具有完全相同的类型和值,因此需要在完全相同的情况下将其转换为
char
。因此
'\0'
和
(char)0
的类型不同,对于完全相同的表达式,您可以考虑
(char)'\0'
与
(char)0
,或
'\0'
与
0
。
NULL
具有实现定义的类型——有时需要将其转换为指针类型,因为它可能具有整数类型。
0.0
具有类型
double
,因此肯定与
0
不同。尽管如此,
float f = 1.0;
与
float f = 1;
和
float f = 1.0f
相同,而
1.0 / i
(其中
i
是一个整数)通常与
1 / i
具有不同的值。因此,任何使用
'\0'
还是
0
的一般规则纯粹是为了方便代码读者 - 对于编译器来说都是一样的。选择您(和您的同事)喜欢的外观,或者定义一个宏
ASCII_NUL
。[*] 或
'\01'
- 由于反斜杠引入了八进制 数字,而不是十进制,因此有时明智的做法是确保它以 0 开头,使其更加明显。对于 0、1、2 没有区别课程。我说“有时”,因为反斜杠后面只能跟3个八进制数字,所以你不能写
\0101
而不是
\101
,以提醒读者这是一个八进制值。这一切都很尴尬,并导致更多的装饰:
\x41
代表大写的A,因此如果你愿意,你可以写
'\x0'
代表0。
如果将 char 设置为 0,这可能意味着 null 终止,但也可能意味着您只是将 char 作为 8 位整数用于计算,而不是作为字符串的一部分。 如果您还在同一代码中使用指针并将它们与零进行比较,那么这就是空指针。
'\0'
,因为
0
是简单字符,但
'\0'
是
NULL
,表示结束字符串。