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