所有的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. Windows端口开启关闭

    转至:https://www.cnblogs.com/shenyiyangle/p/10503754.html netstat-a #显示所有活动的TCP连接以及计算机监听的TCP和UDP端口. ne ...

  2. centos7 配置 zabbix 3 & apache , nginx 与php, mysql 的交互(基本)

    #yum install -y https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-server-mysql-3.0.0 ...

  3. 人工智能之深度学习-初始环境搭建(安装Anaconda3和TensorFlow2步骤详解)

    前言: 本篇文章主要讲解的是在学习人工智能之深度学习时所学到的知识和需要的环境配置(安装Anaconda3和TensorFlow2步骤详解),以及个人的心得体会,汇集成本篇文章,作为自己深度学习的总结 ...

  4. [USACO20FEB]Equilateral Triangles P 题解

    优雅的暴力. 设三个点为 \((i,j,k)\),则有 \(6\) 个未知数即 \(x_i,x_j,x_k,y_i,y_j,y_k\).又因为有 \(2\) 条关于这 \(6\) 个未知数的方程 \( ...

  5. php 23种设计模型 - 策略模式

    介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换,用户还不需要知道其具体的实现 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使 ...

  6. web自动化之selenium(一)

    自动化搭建环境 1.自动搭建(一) #安装 pip install webdriver-helper 1.1示例 from webdriver_helper import * #get_webdriv ...

  7. Net中委托之一

    1.委托的用法 委托是一种特殊的类型 a. 委托可以类外定义,也可以在类里面定义 b. 委托的操作步骤 1.委托的声明 2.委托的实例化 3.委托的调用 2.委托实例 amespace MyDeleg ...

  8. ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求

    很多人可能对ASP.NET Core框架自身记录的诊断日志并不关心,其实这些日志对纠错排错和性能监控提供了很有用的信息.如果需要创建一个APM(Application Performance Mana ...

  9. jpg, jpeg和png区别?

    jpg是jpeg的缩写, 二者一致    PNG就是为取代GIF而生的, 无损压缩, 占用内存多    jpg牺牲图片质量, 有损, 占用内存小    PNG格式可编辑.如图片中有字体等,可利用PS再 ...

  10. JavaScript对不同数据结构的常见循环

    var obj1 = { title : 'tom and jetty', author : 'pecool' } function Book(){} Book.prototype.price = 2 ...