C++转义序列和操作符优先级

2023-05-16

C++转义序列和操作符优先级

  • 1、转义序列:
  • 2、C++ 运算符优先级
  • 注解:

1、转义序列:

	转义序列	描述				表示
			
			简单转义序列

	\'     单引号         ASCII 编码中为字节 0x27 
	\"     双引号         ASCII 编码中为字节 0x22 
	\?     问号           ASCII 编码中为字节 0x3f 
	\\     反斜杠         ASCII 编码中为字节 0x5c 
	\a     响铃           ASCII 编码中为字节 0x07 
	\b     退格           ASCII 编码中为字节 0x08 
	\f     换页           ASCII 编码中为字节 0x0c 
	\n     换行           ASCII 编码中为字节 0x0a 
	\r     回车           ASCII 编码中为字节 0x0d 
	\t     水平制表       ASCII 编码中为字节 0x09 
	\v     垂直制表       ASCII 编码中为字节 0x0b 


	数值转义序列

	\nnn   任意八进制值 	  字节 nnn 
	\xnn   任意十六进制值  字节 nn 


	条件转义序列[1]

	\c     实现定义 		  实现定义 


	通用字符名

	\unnnn     任意 Unicode 值可能生成多个编码单元         编码点 U+nnnn 
	\Unnnnnnnn     任意 Unicode 值可能生成多个编码单元     编码点U+nnnnnnnn 


1.↑ 条件转义序列是条件性支持的。每个条件转义序列中的字符 c 均为基本源字符集中的成员,且不是任何其他转义序列中后随 \ 的字符。

2、C++ 运算符优先级

下表列出 C++ 运算符的优先级和结合性。各个运算符以优先级的降序从上至下列出。


	优先级		运算符						描述						结合性

	1			:: 							作用域解析 					从左到右 
		
	2			a++   a-- 					后缀自增与自减 				从左到右
				type()   type{} 			函数风格转型 	
				a() 						函数调用 	
				a[] 						下标 	
				.   -> 						成员访问 	
		
		
	3			++a   --a 					前缀自增与自减 				从右到左 
				+a   -a 					一元加与减 	
				!   ~ 						逻辑非和逐位非 	
				(type) 						C 风格转型 	
				*a 							间接(解引用) 	
				&a 							取址 	
				sizeof 						取大小[注 1] 	
				co_await 					await 表达式 (C++20) 	
				new   	new[] 				动态内存分配 	
				delete   delete[] 			动态内存分配 	


	4			.*   ->* 					成员指针 					从左到右 

	5			a*b   a/b   a%b 			乘法、除法与余数 			从左到右
																		从左到右
	6			a+b   a-b 					加法与减法                  从左到右
																		从左到右
	7			<<   >> 					逐位左移与右移              从左到右
																		从左到右
	8			<=> 						三路比较运算符(C++20 起)    从左到右
																		从左到右
	9			<   <= 						分别为 < 与 ≤ 的关系运算符  从左到右
				>   >= 						分别为 > 与 ≥ 的关系运算符  从左到右
																		从左到右
	10			==   != 					分别为 = 与 ≠ 的关系运算符  从左到右
																		从左到右
	11			a&b 						逐位与                      从左到右
																		从左到右
	12			^ 							逐位异或(互斥或)          从左到右
																		从左到右
	13			| 							逐位或(可兼或)            从左到右
																		从左到右
	14			&& 							逻辑与                      从左到右
																		从左到右
	15			|| 							逻辑或                      从左到右


	16			a?b:c 						三元条件[注 2] 				从右到左 
				throw 						throw运算符 
				co_yield 					yield表达式 (C++20) 
				= 							直接赋值(C++ 类默认提供) 
				+=   -= 					以和及差复合赋值 
				*=   /=   %= 				以积、商及余数复合赋值 
				<<=   >>= 					以逐位左移及右移复合赋值 
				&=   ^=   |= 				以逐位与、异或及或复合赋值 


	17			, 							逗号 						从左到右 


	1.↑ sizeof 的操作数不能是 C 风格转型:表达式 sizeof (int) * p 无歧义地解释成 (sizeof(int)) * p ,而非 sizeof((int)*p)。

	2.↑ 条件运算符中部(? 与 : 之间)的表达式分析为如同其带有括号:忽略其相对于 ?: 的优先级。


分析表达式时,列于上面表中某行的运算符,将比列于低于它的行中拥有较低优先级的任何运算符,更紧密地与其实参相绑定(如同用了括号)。例如,表达式 std::cout << a & b 和 *p++ 被分析为 (std::cout << a) & b 和 *(p++),而非 std::cout << (a & b) 或 (*p)++。

拥有相同优先级的运算符以其结合性的方向与各参数绑定。例如表达式 a = b = c 被分析为 a = (b = c) 而非 (a = b) = c,因为赋值具有从右到左结合性,但 a + b - c 被分析为 (a + b) - c 而非 a + (b - c),因为加法和减法具有从左到右结合性。

结合性规定对于一元运算符是冗余的,只为完备而给出:一元前缀运算符始终从右到左结合(delete ++*p 为 delete(++(*p)))而一元后缀运算符始终从左到右结合(a[1][2]++ 为 ((a[1])[2])++)。要注意,结合性对成员访问运算符是有意义的,即使在它们与一元后缀运算符组合时也是如此:a.b++ 分析为 (a.b)++ 而非 a.(b++)。

运算符优先级不受运算符重载影响。例如,std::cout << a ? b : c; 分析为 (std::cout << a) ? b : c;,因为算术左移的优先级高于条件运算符。

注解:

	优先级和结合性是编译时概念,与求值顺序无关,后者是运行时概念。

	标准自身不指定优先级。它们是从文法导出的。

	表中并未包括 const_cast、static_cast、dynamic_cast、reinterpret_cast、typeid、sizeof...、noexcept 及 alignof,因为它们决不会有歧义。

	一些运算符拥有代用写法(例如,&& 可为 and、|| 可为 or、! 可为 not 等)。

	C 中,三元条件运算符拥有高于赋值运算符的优先级。因此,表达式 e = a < d ? a++ : a = d 在 C++ 中剖析成 e = ((a < d) ? (a++) : (a = d)),但在 C 中会由于 C 的语法或语义制约而编译失败。细节见对应的 C 页面。


参阅:


					常见运算符

赋值 		自增/自减 		算术 		逻辑 		比较 		成员访问 		其他 

a = b		++a				+a			!a			a == b		a[b]			a(...)
a += b		--a				-a			a && b		a != b		*a				a, b
a -= b		a++				a + b		a || b		a < b		&a				? :
a *= b		a--				a - b					a > b		a->b
a /= b						a * b					a <= b		a.b
a %= b						a / b					a >= b		a->*b
a &= b						a % b					a <=> b		a.*b
a |= b						~a
a ^= b						a & b
a <<= b						a | b
a >>= b						a ^ b
							a << b
							a >> b



					特殊运算符


static_cast 		转换一个类型为另一相关类型
dynamic_cast 		在继承层级中转换
const_cast 			添加或移除 cv 限定符
reinterpret_cast 	转换类型到无关类型

C 风格转型 以 static_cast 、 const_cast 及 reinterpret_cast 的混合转换一个类型到另一类型
new 				创建有动态存储期的对象
delete 				销毁先前由 new 表达式创建的对象,并释放其所拥有的内存区域
sizeof 				查询类型的大小
sizeof... 			查询形参包的大小(C++11 起)
typeid 				查询类型的类型信息
noexcept 			查询表达式是否能抛出异常(C++11 起)
alignof 			查询类型的对齐要求(C++11 起)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++转义序列和操作符优先级 的相关文章

随机推荐

  • ubuntu各种版本上测试usb摄像头(支持单目摄像头、乐视、realsense等)是否正常工作

    一 硬件要求 xff1a ubuntu20 04 xff08 ubuntu18 04的话 xff0c 需要把下面出现的noetic改为melodic xff1b ubuntu16 04的话 xff0c 需要把下面出现的noetic改为kin
  • 使用arduino控制多个PCA968516路舵机控制板从而达到最多可以控制992个伺服舵机

    1 摘要 在本教程中 xff0c 我将向您展示如何使用这些通过 I2C 接口控制的 16 通道 PCA9685 PWM 驱动器将多达992 个伺服器连接到 Arduino 这些板中的每一个都可以驱动多达 16 个舵机或 PWM 输出 xff
  • 分别在 visual studio 2022 和 visual studio code中配置opencv环境,并运行相关代码

    window10环境下 xff1a 一 在visual studio 2022中配置opencv环境 xff0c 并运行相关代码 1 安装visual studio 2022 xff0c 在官网下载社区版安装包 1 1 下载后双击运行安装包
  • 0.8 - GPIO的输入输出模式

    GPIO xff1a General purpose input output 从参考手册可知 xff0c GPIO可以配置成上图中的多种模式 xff0c 但是要理解这些名字的含义还是要具体分析GPIO功能框图 xff1a 结合GPIO的输
  • opencv基础-印度小哥

    基础课程 第一章 读取图片 视频和摄像头 Chapter 1 Read Images Videos and Webcams 图片放在程序所在文件夹下的Resources test png 1 1 opencv读取一张图片并显示 xff1a
  • 为ubuntu配置WiFi

    1 前提条件 ubuntu不论什么版本 xff0c 如果想要正常使用wifi xff0c 必须在电脑的bios中把secure boot设定为disable 2 快捷指令 xff08 WiFi相关的常用命令行指令 xff09 2 1查看电脑
  • 嵌入式C语言自我修养:从芯片、编译器到操作系统-习题、笔记

    前沿 C语言测试 1 基本概念考查 什么是标识符 关键字和预定义标识符 三者有何区别 标识符 xff08 Identifier xff09 由程序员定义 xff0c 用来表示变量 xff0c 包括了变量名 函数名 宏名 结构体名等 标识符的
  • smile@smile-X3-S:~/app_install/mapx/build$ sudo make

    smile 64 smile X3 S app install mapx build span class token function sudo span span class token function make span span
  • 两台ubuntu之间文件互传方法

    1 查找本机ip地址 终端输入 xff08 不是自己的电脑 xff0c 是服务其的IP xff09 xff1a ifconfig span class token operator span a 查看inet 192打头的地址 2 查找本机
  • 单片机通过串口发送浮点类型数据

    单片机通过串口向串口助手或者其他器件发送数据时是不能直接发送浮点类型数据的 xff0c 通过printf 34 f 34 1 28 发送浮点数据 在串口助手看似是小数 xff0c 其实是字符串类型 xff0c 它们是各符号对应的ASSCII
  • 制作系统启动盘和制作windows+Ubuntu双系统启动盘

    制作windows 43 Ubuntu双系统启动盘 前言1 准备软件和工具 xff1a 开始1 软件和系统镜像自行在网上下载 2 下载好系统镜像之后 xff0c 开始制作ubuntu系统盘 xff1a 3 制作好ubuntu启动盘之后 xf
  • 虚拟机分配的硬盘太大怎么办?

    虚拟机分配的硬盘太大怎么办 xff1f 虚拟机分配的硬盘太大怎么办 xff1f 文章来源说明 xff1a 开始1 首先需要将虚拟机中多余的硬盘空间删除 xff0c 在此电脑中右键管理 xff0c 然后在磁盘管理中右键有多余空间的磁盘进行压缩
  • QT界面窗口的显示和隐藏,关闭

    这里写目录标题 QT窗口的显示和隐藏 xff1a 1 隐藏窗口1 1 介绍 xff1a 2 显示窗口2 1 介绍 xff1a 3 关闭窗口常用函数有 xff1a QT窗口的显示和隐藏 xff1a 1 隐藏窗口 span class toke
  • QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决 xff1a 1 查看源文件的编码格式 xff0c 有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示 2 在代码里面解决 xff1a 3 用法 xff1a QT的中文显示
  • 0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路

    首先 xff0c 从参考手册可知 xff0c 程序存储器 xff08 flash xff09 数据存储器 SRAM 寄存器 外设控制 和输入输出端口被组织在同一个4GB的线性地址空间内 数据字节以小端格式存放在存储器中 一个字里的最低地址字
  • Linux文件/文件夹建立软硬链接

    建立软连接 xff1a sudo ln s home spike Downloads redis src redis server usr local bin redis server 源文件 链接到 目标文件 xff0c 这两个文件目录都
  • Linux中记录终端(Terminal)输出到文本文件四种方法

    Linux中记录终端 xff08 Terminal xff09 输出到文本文件 Linux中记录终端 xff08 Terminal xff09 输出到文本文件 一 xff0c 如何把命令运行的结果保存到文件当中 二 command gt f
  • C++ 标准库头文件汇集:

    C 43 43 标准库头文件汇集 xff1a C 43 43 标准库的接口由下列头文件的汇集定义 C 43 43 标准库头文件汇集 xff1a 概念库协程库工具库动态内存管理数值极限错误处理字符串库容器库迭代器库范围库算法库数值库本地化库输
  • C++开源库列表总结记录

    开源 C 43 43 库列表 前言包管理器库音频 音频指纹格式标签CD 性能测试 通信 并发 配置 XMLJSONYAMLTOMLHOCONCSS容器 密码学 数据库 嵌入语言绑定 嵌入式 实时 文件元数据 金融计算 游戏引擎架构 通用多媒
  • C++转义序列和操作符优先级

    C 43 43 转义序列和操作符优先级 1 转义序列 xff1a 2 C 43 43 运算符优先级注解 1 转义序列 xff1a 转义序列 描述 表示 简单转义序列 39 单引号 ASCII 编码中为字节 0x27 34 双引号 ASCII