使用(char)0
和'\0'
来表示字符数组中的终止空字符有什么区别?
发布于 2011-10-13 17:16:45
字符文字中的反斜杠符号允许您指定字符的数值,而不是使用字符本身。所以'\1'
*表示“数值为1的字符”,'\2'
表示“数值为2的字符”,以此类推。由于C语言的怪癖,字符字面量实际上具有int
类型,实际上int
也用于处理其他上下文中的字符,例如fgetc
的返回值。因此,'\1'
表示“数值为1的字符的整型数值”,依此类推。
由于字符是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个八进制数,所以你不能用\101
代替\0101
来提醒读者它是一个八进制值。这一切都很笨拙,并导致了更多的装饰:大写A的\x41
,因此如果你愿意,你可以写0的'\x0'
。
发布于 2011-09-28 13:17:24
它们都是0,但是(char) 0
是一个字符,而'\0'
(不直观地)是一个int
。如果值为0,这种类型差异通常不会影响您的程序。
我更喜欢'\0'
,因为它是用于此的常量。
发布于 2011-09-28 14:35:47
在C中,零可以表示许多不同的东西。你应该使用空字符'\0',因为这样就不会混淆你的意图是字符串终止了。
如果您将char设置为0,这可能意味着空终止,但也可能意味着您只是将char用作8位整数进行计算,而不是作为字符串的一部分。如果您还在同一代码中使用指针,并将它们与零进行比较,这可能会进一步混淆,因为零就是空指针。
https://stackoverflow.com/questions/7578632
复制相似问题