c语言空字符和 0 的区别,C语言'\0'、'0'、' '、“0”、0的区别详解

在一个微信公众号:AutoCodes  上面看到一篇推文,感觉整理的挺好的,分享给大家!后面有一个问题,可以一块讨论,数字0和字符0不是一样的吧,那数字有ASCII码吗?原文如下:【C语言】'\0'、'0'、' '、“0”、0的区别详解

文章内容部分整理自网络!若有冒犯请指出,我们及时更正!

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字符号还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

有关字符集和编码的内容继续在微信公众号:AutoCodes中推出。

需要明白的是,这里的映射关系式“字符” "数字(编码)"。第一部分:区别第一:'\0'

是字符,其ASCII码为0,内存中存放表示:0000 0000。

'\0'是一个ASCII控制字符,是转义字符,代表空字符。作为字符串结尾字符。字符'\0'可以直接用ASCII码0表示,0不管是几进制,都是0(十进制),也就是0x00(十六进制)。

char c = '\0';

char c = 0;   //ASCII码为0的字符赋给字符变量c

这两个是一样的。当你打印的时候看你以什么形式去打印,如果是 %d,那会打印出0,如果是 %c 打印出一个空格,不是输出到屏幕上'\0'。'\0'与 0 本质上其实是一样的,一个是ASCII码,一个是该ASCII码对应的字符。字符串结束符 '\0' 的 ASCII 值正好是 0。所以用0判断和用 '\0' 判断,结果一样(在内存中存放一样)。

'\0'就表示将字符'0'转义,系统遇到'\0'时输出一个空格,从而表示ASCII码为0的字符(字符串结束符),而数值0和这个是一个意思,

‘\0’是字符数组或者字符串结束标志,系统在引用字符数组或者字符串的时候遇到‘\0’就会结束,在进行字符数组初始化的时候,这个‘\0’是自动加上去的。而‘0’可以作为字符数组的一个元素。第二:'0'

'0'是数字字符,其ASCII码为48,也就是0x30,内存中存放表示:0011 0000第三:' '

' '空格是一个字符,其ASCII码为32,内存中存放表示:0011 0000

比如   abcd (空格)cdefg;

存入数组时,空格作为一个字符占有一个字节的空间,我们可以把它看作一个字符去处理。而 "\0" 则是这个字符串的结束标识符,也占有一个字节的空间,表示字符串结束!第四:"0"

"0"是字符串。

“0”代表字符串“0”,即这个字符串里只包含一个字符'0'(当然字符串结尾默认再加一个'\0')第五:0

0是个整数,内存中表示为0000 0000,0就代表阿拉伯数字0

在逻辑运算值方面,0和'0'(ascii码值为48)的主要区别,比如 !0 =1  !'0'=0;

字符0的ASCII码实际上是48,C语言中字符0 只占一个字节(Byte),也就是内存中存放的是 01001000 (其中每一个0或1表示一个bit位)

而整数0, 它在内存中的表示全是0,C语言中一个整数的占4个字节,整数0在内存中的表示为: 00000000 00000000 00000000 00000000 .

如下:

char c = '0';  //字符0

int a = 0;     //整数0

printf("%c, %d\n", c, a); //0,0

printf("%d\n", c); //48   用整数形式打印字符,实际是打印c在内存中的值。

printf("%d\n", (c+a)); //48

printf("%c\n", (char)(c+a)); //0

输出的结果:

0,0

48

48

0

从上面你就能看出字符0和整数0的区别了。第二部分:内容扩展

附:如果用scanf来接收字符串的话,字符串中不能含有空格,否则将以空格作为串的结束符。如果你键入得是hello world 那么实际上scanf只能获取hello 这个单词。所以要接收空格的话可以用gets()这个函数。gets(str)是读入一串以回车结束的字符,顺序存入到以str为首地址的内存单元中,最后写入字符串结束标志 “\0 “,

同样在输出字符串时要用puts(),输出时直到遇到 \0 为止,最后输出一个换行符。第三部分:问题

那么,C语言中既然'\0'与空格‘ ’是不一样的,那为什么在字符串问题中,scanf中还不能读入空格?例如字符串"hello world",用scanf以%s格式输入,只能输出"hello",字符串是以‘\0’作为结尾,而‘ ’!='\0'。为什么呢?

这不是说明空格与\0等价,而是由于C语言的缓冲机制,scanf读取数据不是从键盘直接读取,因为键盘是字符型输入设备,且它是中断方式来被操作系统控制,所以这些IO设备存取速率及其低下,而内存是块设备,读取速度非常快,因此引入缓冲区机制来缓冲IO设备与内存的数据交换,scanf也是从缓冲区地区,而scanf函数是把空格作为缓冲区数据的分隔符,每遇到一个空格,则表示当前一段数据为可用数据,被scanf读取,而不是空格表示字符结束而被读入。第四部分:遗留问题

在我们平台上,有读者提出这样一个问题:在查找网上资料的过程中,看到有这么一个说法“数字的ASCII码”,数字有ASCCII码吗?

读者认为字符'0'、'1'......'9'有对应的ASCII码,而数字0、1......9是没有ASCII码的。对于这个问题,给大家一块讨论~

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值