所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

——以上来自百度百科转义字符

直接看代码吧


char c1 = '\012';
char c2 = '\0123';
char c3 = '\0a12';
printf("%c,%c,%c\n",c1,c2,c3);

猜一猜,输出结果是什么?

……

……

……

公布答案:

在屏幕上实际输出了一个换行符 '\n' 一个字符 '3' 一个字符 '2'

\ddd

1到3位八进制数所代表的任意字符            三位八进制

是不是有点懵啊,不是说好的八进制吗,第一个 '\n' 的ascall码为10,刚好等于八进制的 '\012'

为什么后两个算出来后的值却是 32 啊?

下面在看一组测试用例你就懂了:

	char c4   = '\007';
//char c4_1 = '\400';
char c4_2 = '\377';
char c4_3 = '\0377';
char c4_4 = '\03a7';
char c4_4 = '\a07';

老规矩,猜一猜,输出结果是什么?

……

……

……

是不是还是有点懵啊,别急,再看一张图

下面揭晓谜题,其实 \ddd 最多只支持三位数字,并且三位数字也不是任意的,一旦大于等于八进制数 '/400 '(十进制256=8进制400)就超过了ascall码的范围,编译器就会报错。另外大于三位,或者遇到非八进制数字时则转换结束,直接取末尾数字。所以现在再回头去看看是不是发现很简单吧。

以免我的表述不够准确,在举个小栗子:

  • char ch = '\062'      ch等于字符 ‘2‘  ,十进制ascall码值为50,

该式把十进制的ascall对应值的字符赋值给ch                                            等同于ch = '2'; 或ch=50;

  • char ch = '\0012'    ch等于字符 '2'  ,十进制ascall码值为50,

过长,进行截断。该式截取最后一个2,以字符'2'的形式 赋值给ch          等同于ch = '2'; 或ch=50;

  • char ch = '\009'       ch等于字符 '9'  ,十进制ascall码值为57,

该式把十进制的ascall对应值的字符赋值给ch                                             等同于ch = '9'; 或ch=57;

  • char ch = '\0009'     ch等于字符 '9'  ,十进制ascall码值为57,

过长,进行截断。该式截取最后的 以字符'9'的形式赋值给ch             等同于ch = '9'; 或ch=57;

总结:

使用 '\ddd' 方法赋值实际上是将八进制数字通过转义字符 '\' 赋值为ascii表中对应的字符。

char ch = '\60';  char ch = 48;  char ch = '0'; 这三个语句是一样的效果。

只不过第一种是通过八进制的方式,第二种是通过10进制的方式,三种是通过字符的方式。

ascii表:

另外需要注意的是,使用字符赋值的时候,单引号‘’通常只写一个字符。因为char类型只占一个字节,如果写入字符过多,也只会取其中一个字符。

如:char ch = 'ABC'; 最终ch的值为'C'。

仅测试在我本地计算机,和Linux服务器都将此语句执行后,ch保存为'C'。由此猜测它们都是以小端的方式存储数据。

何谓小端:如对于一个12345的整数,左边的1是‘万’位也就是我们所说的高位,而个为的5就是低位。

小端顾名思义就是先存储小的那一端。如对于12345我们存储的时候 54321 这样存储。大端存储方式自然相反。

而,对于计算机来说,每8位二进制为一字节,也就是2个16进制数,而我们使用小端存储 ch 时就做了这样的事。

并且,由于ch是char类型,只能容纳一个字节的数据,因此ch最终的取值为十六进制数 0x43,也就是字符 'C'。

同样的,对于int类型也是一样的存储方式。

 
转存失败重新上传取消
转存失败重新上传取消

'\ddd'转义字符与八进制转换的更多相关文章

  1. 含html转义字符编码(四)转换--python

    在抓取下来的网页源码显示的是如下的内容,而不是可读性的汉字 (当然,如果是在Web页面上展示,则实体会自动被浏览器转为原字符,正常显示) 经查资料后得知, 在网页中以四开头的是HTML实体,具体什么是 ...

  2. Python如何把八进制转换成ASCII码

    做题途中拿到一串八进制字符串 0126 062 0126 0163 0142 0103 0102 0153 0142 062 065 0154 0111 0121 0157 0113 0111 010 ...

  3. char的越界赋值即其原理剖析

    思考: int ch = 'A'; int ch1 = 65; int ch2 = 321; printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么 ...

  4. 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换

    一. 十进制与二进制之间的转换  (1) 十进制转换为二进制,分为整数部分和小数部分  ① 整数部分  方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权 ...

  5. Android,使用Json发送数据中,使用的Java转义字符 KanKan原创

    kankan原创 与php后台发送数据的时候.要求用到这样的格式. private void sendJson(){ //初始化自己定义的handler CashHandler handler = n ...

  6. C\C++的转义字符

    C\C++的转义字符 所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符, ...

  7. 关于java的转义字符

    关于java的转义字符 我们都知道  String s="ad,dfjdlfs,df,s,dfl";              执行 String re[]=s.split(&qu ...

  8. C语言的转义字符

    原文地址:http://blog.163.com/sunshine_linting/blog/static/44893323201181325818165/ 在字符集中,有一类字符具有这样的特性:当从 ...

  9. [c/c++] programming之路(3)、转义字符及内存

    一.转义字符 #include<stdio.h> void main(){ printf("hello \nworld\a");// \n换行 \a机器响一声 getc ...

随机推荐

  1. journactl日志查看命令-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月27日 内容 journalctl是systemd统一管理所有unit(服务)的启动日志.可以通过journalctl一个命令查看所有日志. 所有用 ...

  2. 二级py--day2

    二级py day2-3 1.进程至少活动情况分为:运行状态.就绪状态.等待状态(阻塞状态).创建状态.终止状态 2.进程的特性包括: 并发性和动态性 3.计算机地址位数决定了内存的最大容量,决定了虚拟 ...

  3. table表格的td行利用css显示...

      默认超过指定长度以...显示, 鼠标放到文本上显示全 代码如下 .fh{ max-width:220px; word-wrap:break-word; text-overflow:ellipsis ...

  4. php 23种设计模型 - 中介者模式

    中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...

  5. LGP2155题解

    lg最优解来写题解啦( 题目大意: 多测: \[\sum_{i=1}^{n!}[\gcd(i,m!)=1] \] 根据 \(\gcd\) 的结论,我们可以得到答案其实是: \[\frac {n!} { ...

  6. 提升Spring Boot项目中API接口并发能力的一个注解,效果明显

    异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次 ...

  7. 详解 Java 内部类

    内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点. 从种类上说,内部类可以分为四类: ...

  8. 初学者都能学会的ElasticSearch入门实战

    大家好,我是咔咔 不期速成,日拱一卒 项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用. 咔咔之前写了 ...

  9. [实验吧](web)因缺思厅的绕过 源码审计绕过

    0x00 直接看源码吧 早上写了个注入fuzz的脚本,无聊回到实验吧的题目进行测试,发现了这道题 地址:http://ctf5.shiyanbar.com/web/pcat/index.php 分析如 ...

  10. [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业

    [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业 bzoj   bzoj 题目大意:一个序列,m个询问在$[l,r]$区间的$[x,y]$范围内的数的个数/种类. ...