C语言进阶—— 接续符和转义符13

Wesley13
• 阅读 653

接续符的意义:

  • C语言中的接续符 (\) 是指示编译器行为的利器

我们来看一个案例:

 1 #in\
 2 clud\
 3 e <st\
 4 dio.h>
 5 
 6 in\
 7 t m\
 8 ain(\
 9 )
10 {
11 pri\
12 ntf\
13     (\
14     "Hello bupi\n"
15     )\
16     ;
17 
18 ret\
19 urn 0;
20 }

你一眼看过去可能会认为这个不像C语言的代码,但是他的确是的,只是大量使用了接续符,在现实中不用这样使用接续符,这只是一个例子。

有人或许会问,这样一段简单的程序使用接续符就变得这样的混乱,那我们还有必要去了解接续符吗?答案是要了解

改进前的代码:

 1 #include <stdio.h>
 2 
 3 #define SWAP(a,b)  { int temp = a; a = b; b = temp; }
 4 
 5 int main()
 6 {
 7     int a = 1;
 8     int b = 2;
 9     int c = 3;
10 
11     SWAP(a,b);
12 
13     printf("a = %d, b = %d\n", a, b);
14 
15     SWAP(b,c);
16 
17     printf("b = %d, c = %d\n", b, c);
18 
19     return 0;
20 }

 第三行是一个宏代码块,就是交换两个变量值,但是代码这样挤在一行,可读性并不好。

使用接续符改进后:

 1 #include <stdio.h>
 2 
 3 #define SWAP(a,b)      \
 4 {                      \
 5     int temp = a;      \
 6     a = b;             \
 7     b = temp;          \
 8 }
 9 
10 int main()
11 {
12     int a = 1;
13     int b = 2;
14     int c = 3;
15     
16     SWAP(a,b);
17     
18     printf("a = %d, b = %d\n", a, b);
19     
20     SWAP(b,c);
21     
22     printf("b = %d, c = %d\n", b, c);
23     
24     return 0;
25 }

使用接续符改进后的宏代码块可读性大大增加了。

接续符的使用:

  •  编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行
  • 在接续单词时,反斜杠之后不能有空格,反斜杠的下一行也不能有空格
  • 接续符适合在定义宏代码块时使用

转义符的意义:C语言的转义符 (\) 主要用于表示无回显示符,也可以表示常规字符

  •   \n  回车换行 (本义是光标往下一行)
  •   \t  横向跳到下一制表位
  •   \v  竖向跳格
  •   \b  退格
  •   \r  回车(本义是光标重新回到本行开头)
  •   \f  走纸换行
  •   \\  反斜杠符   \
  •   \'  单引号符
  •   \a  鸣铃
  •   \ddd  一至三位八进制数代表的字符
  •   \xhh  一至两位十六进制数所代表的字符

转移符的使用:当反斜杠 (\) 作为转移符使用时必须出现在单引号或者双引号之间

案例:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     char enter = '\n';
 6     
 7     char* p = "\141\t\x62";
 8     
 9     printf("%s", p);
10     printf("%c", enter);
11     
12     return 0;
13 }

小结:

  • C语言的反斜杠同时具有接续符和转移符的作用
  • 作为接续符使用的时候可直接出现在程序中
  • 作为转移符使用的时需出现在单引号或者双引号之间
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
2年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Sentinel 1.7.2 发布,完善开源生态及扩展性
多样化的适配模块到目前为止,Sentinel已覆盖微服务、APIGateway和ServiceMesh三大板块的核心生态,同时多语言已推出Java、C、Go三种语言的原生实现。!78636450_ef3a4b00_78da_11ea_89ce_c7a2b58c2deb(https://yqfile.alicd
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Wesley13 Wesley13
2年前
C语言概述
C语言基本语法单位字符集字符是高级语言中的最小单位,是构成语法单位的基础。C语言中规定可以使用的合法字符的集合为C字符集C字符集采用ASCII码字符集C语言字符集由下列字符组成(1)字母和数字字符。(小写字母a~z、大写字母A~Z、数字0~9)(2)不可打印的字符。(空格符、回车符、换行符、控
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反