所有的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. idea教程--使用mave创建普通java项目

    1.点击箭头所示的"Create New Project"选项 2.勾选图示所示的"Create From Archetype"复选框,在下面的下拉选项中我们选 ...

  2. 一、ES6基础

    一.ECMAScript和JavaScript关系 JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标 准,但 ...

  3. MySQL-常用的几种修改密码方法

    在MySQL中一般常规的给用户修改密码可以用到以下几种方法: 1.使用 mysqladmin命令修改密码 1 mysqladmin -u username -p password "newP ...

  4. 堪比JMeter的.Net压测工具 - Crank 入门篇

    1. 前言 Crank 是.NET 团队用来运行基准测试的基准测试基础架构,包括(但不限于)来自TechEmpower Web 框架基准测试的场景,是2021年.NET Conf 大会上介绍的一项新的 ...

  5. JZ-011-二进制中 1 的个数

    二进制中 1 的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数.其中负数用补码表示. 题目链接: 二进制中 1 的个数 代码 /** * 标题:二进制中 1 的个数 * 题目描述 * ...

  6. k8s集群StatefulSets的Pod调度查询丢失问题?

    k8s集群StatefulSets的Pod调度查询丢失问题? 考点之简单介绍下StatefulSets 和 Deployment 之间有什么本质区别?特定场景该如何做出选择呢? 考点之你能辩证的说说看 ...

  7. 5分钟学会 gRPC

    介绍 我猜测大部分长期使用 Java 的开发者应该较少会接触 gRPC,毕竟在 Java 圈子里大部分使用的还是 Dubbo/SpringClound 这两类服务框架. 我也是近段时间有机会从零开始重 ...

  8. 转发有关tomcat和nginx

    nginx 与 tomcat 组合搭建web服务   部分内容转自 http://www.cnblogs.com/naaoveGIS/ 1. Web服务 nginx是常用的web服务器,用于获取静态资 ...

  9. Redis原理再学习05:数据结构-整数集合intset

    intset介绍 intset 整数集合,当一个集合只有整数元素,且元素数量不多时,Redis 就会用整数集合作为集合键的底层实现. redis> SADD numbers 1 3 5 7 9 ...

  10. 如何从头到脚彻底解决一个MySQL Bug

    摘要:为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例. 说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL. 华为云数据库新版本在发布之前,会 ...