(char)0 和 ' ' 有什么区别?在 C

问题描述 投票:0回答:4

使用

(char)0
'\0'
表示字符数组中的终止空字符有什么区别?

c null-character
4个回答
33
投票

它们都是 0,但是

(char) 0
char
,而
'\0'
(不直观地)是
int
。 如果值为 0,这种类型差异通常不会影响您的程序。

我更喜欢

'\0'
,因为这是为此目的而设计的常数。


25
投票

字符文字中的反斜杠表示法允许您指定字符的数值,而不是使用字符本身。所以

'\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。


3
投票
在 C 中,零可以表示很多不同的东西。您应该使用空字符 ' ',因为这样就不会混淆您的意图是字符串终止。

如果将 char 设置为 0,这可能意味着 null 终止,但也可能意味着您只是将 char 作为 8 位整数用于计算,而不是作为字符串的一部分。 如果您还在同一代码中使用指针并将它们与零进行比较,那么这就是空指针。


1
投票
字符数组意味着您正在获取字符串,因此我建议您在读取用户的所有字符后在字符数组的末尾使用

'\0'

,因为
0
是简单字符,但
'\0'
NULL
,表示结束字符串。

© www.soinside.com 2019 - 2024. All rights reserved.