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码的。对于这个问题,给大家一块讨论~
c语言空字符和 0 的区别,C语言'\0'、'0'、' '、“0”、0的区别详解相关推荐
- C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解
这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...
- android 6.0 存储卡,Android 6.0区别U盘和SD卡设备的方法详解
如下所示: public static boolean isSdcardExists(Context context) { StorageManager storageManager = Storag ...
- R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析详解实战:拟合连续性自变量和事件风险之间的关系:基于survival包lung数据
R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析详解实战:拟合连续性自变量和事件风险之间的关系:基于survival包lung数据 目录
- c语言常量的正确表示const,C语言中的const和free用法详解
注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...
- C语言指针面试题解析(万字超多题,每题都有详解)
目录 零.前言 1.整型数组 2.字符数组 1.strlen函数 2.arr[]={'a','b','c'....}型 1.sizeof()计算 2.strlen()计算 3.char arr[]=& ...
- 是否显示展开_Creo7.0教程之绝对精度对钣金件展开的作用详解
在讲Creo7.0绝对精度对钣金展开的帮助之前,我们有必要先来说明一下Creo的精度定义. 刚使用Creo7.0版本的新建模型,很多网友就问,怎么模板文件中有两个同样单位的选择,"abs&q ...
- go语言导入git包_使用go module导入本地包的方法教程详解
go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...
- Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文详解。QTP
UFT入门之侦测器(ObjectSpy)及录制第一个脚本 实验说明 1.Quick Test Pro(QTP)11.5后更名为Unified Functional Testing(UFT) 2. 实验 ...
- c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解
c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...
- 【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解
目录 硬知识 SSD1306简介 I2C 接口 从机地址位(SA0) I2C 总线写数据 命令解码器 晶振电路和显示时间发生器 复位 图形显示数据RAM (GDDRAM) 命令表 基本命令表 部分指令 ...
最新文章
- 信用模型评分卡入门介绍
- 打印show attend and tell的解码器网络结构
- [转] MemCached 的 stats 命令
- 只需5分钟即可启动并运行分层架构:: Spring Boot第1部分
- GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)
- 榨取kkksc03(洛谷-P1855)
- 2020年最前沿的 8 本AI技术图书—文末留言赠8本
- 部署项目到Linux服务器步骤
- Objective-C的Runtime System
- Linux操作系统下进程讲解(史上最强总结)
- 北大生物信息学学习(2) 生物学及生物学信息学的发展
- abb机器人工具坐标系设定方式_设定abb机器人工具坐标的方法
- Linux课程设计:Linux系统下多进程的创建与通信
- 计算机电路基础知识点总结,《计算机电路基础》课程教学方法的探索
- 运算放大器---输入偏置电流(IB)
- Unity IOS设备陀螺仪控制相机旋转
- 基于TencentOS-tiny实现甲醛传感器(英国达特 WZ-S)数据解析思路及实现
- java做一个客房管理系统定制_java实现客房管理系统
- AddressBook
- Qt程序无法启动,debug时提示During startup program exited with code 0xc0000135
热门文章
- Egg 2.20.0 发布,阿里开源的企业级 Node.js 框架
- 明晰当下洞见未来 做区块链你还需要这四项技能
- D.579 - ClockHands
- 自定义标签之使用struts的valueStack取值
- ADO.NET入门教程(六) 谈谈Command对象与数据检索
- java中带包的类在命令行中的编译和执行中出现的问题及解决办法
- 那些年使用Android studio遇到的问题
- c语言一行灯的熄灯问题,熄灯问题
- android缓存垃圾扫描功能吗,Android 系统缓存扫描与清理方法分析
- 重构Webpack系列之六 ---- 配置文件