Mat*_*hen 27
它们都是0,但是(char) 0是char,而'\0'(不直观)是int.如果值为0,则此类型差异通常不会影响您的程序.
我更喜欢'\0',因为那是为此而设的常数.
Ste*_*sop 23
字符文字中的反斜杠表示法允许您指定字符的数值而不是使用字符本身.所以'\1'[*]表示"数值为1 '\2'的字符",表示"数值为2的字符",等等.由于C的怪癖,字符文字实际上具有类型int,并且实际上int也用于处理其他上下文中的字符,例如返回值fgetc.所以'\1'意味着"数值为int,数值为1的字符",依此类推.
由于字符是 C 中的数值,"数值为1的字符"实际上是 (char)1,并且额外的装饰'\1'对编译器没有影响 - '\1'具有与C中相同的类型和值1.因此更需要反斜杠表示法字符串文字,而不是字符文字,用于插入没有自己的转义码的不可打印字符.
就个人而言,我更愿意0在我的意思是0时写,并且让隐式转换做他们的事情.有些人发现很难理解.当与这些人一起工作时,'\0'如果你指的是一个值为0的字符,那就更有用了,也就是说你期望0很快就会隐式转换为char类型.类似地,NULL当你的意思是空指针常量0.0时,它可以帮助你写,当你的意思是一个值为0的double时,依此类推.
它是否对编译器产生任何影响,以及它是否需要强制转换,取决于上下文.由于'\0'具有完全相同的类型和值0,因此需要char在完全相同的情况下进行转换.所以'\0'和(char)0在类型不同,你可以考虑完全等价的表达(char)'\0'VS (char)0或'\0'VS 0.NULL具有实现定义的类型 - 有时需要将其强制转换为指针类型,因为它可能具有整数类型.0.0有类型double,所以肯定不同0.尽管如此,float f = 1.0;是相同的float f = 1;和float f = 1.0f,而1.0 / i其中i是一个int,通常具有不同的值1 / i.
因此,任何一般规则是使用'\0'还是0纯粹是为了方便读者的代码 - 对于编译器来说都是一样的.选择你(和你的同事)喜欢的外观,或者定义一个宏ASCII_NUL.
[*]或'\01'- 因为反斜杠引入了一个八进制数,而不是十进制数,所以通过确保以0开始使这一点变得更加明显是明智的.当然,0,1,2没有区别.我说"有时",因为反斜杠只能跟随3个八进制数字,所以你不能写,\0101而不是\101,提醒读者它是八进制值.这一切都很尴尬,并导致更多的装饰:\x41对于大写A,'\x0'如果你愿意,你可以写0.