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

24 篇文章 1 订阅
9 篇文章 1 订阅

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 起)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值