首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(char)0和'\0‘的区别是什么?在C中

(char)0和'\0‘的区别是什么?在C中
EN

Stack Overflow用户
提问于 2011-09-28 13:15:41
回答 4查看 41.9K关注 0票数 29

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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'0NULL具有实现定义的类型--有时需要将其转换为指针类型,因为它可能具有整数类型。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'

票数 23
EN

Stack Overflow用户

发布于 2011-09-28 13:17:24

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

我更喜欢'\0',因为它是用于此的常量。

票数 29
EN

Stack Overflow用户

发布于 2011-09-28 14:35:47

在C中,零可以表示许多不同的东西。你应该使用空字符'\0',因为这样就不会混淆你的意图是字符串终止了。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7578632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档