C++中的运算符总结(8):运算符的优先级
您可能在学校学过算术运算顺序口诀 BODMAS( Brackets Orders Division Multiplication Addition Subtraction,先括号,后乘除,再加减),它指出了复杂算术表达式的计算顺序。
在 C++中,假设使用运算符编写了如下表达式:
int myNumber = 10 * 30 + 20 – 5 * 5 << 2;
myNumber 的值是多少呢?这可没有猜测的空间, C++ 标准非常严格地指定了各种运算的执行顺序。
这种顺序被称为运算符优先级,如下表所示:
等级 | 名称 | 运算符 |
---|---|---|
1 | 作用域解析运算符 | :: |
2 | 成员选择、下标、后缀递增和后缀递减 | .、 ->、 ( )、 ++、 – |
3 | sizeof、前缀递增和递减、求补、逻辑 NOT、单目加和 减、取址和解除引用、 new、 new[]、 delete、 delete[]、 类型转换、 sizeof( ) | ++、 --、 ^、 !、 +、 -、 &、 *、 ( ) |
4 | 用于指针的成员选择 | .、 -> |
5 | 乘、除、求模 | *、 /、 % |
6 | 加、减 | +、 - |
7 | 移位(左移和右移) | <<、 >> |
8 | 不等关系 | <、 <=、 >、 >= |
9 | 相等关系 | ==、 != |
10 | 按位 AND | & |
11 | 按位 XOR | ^ |
12 | 按位 OR | | |
13 | 逻辑 AND | && |
14 | 逻辑 OR | || |
15 | 条件运算符 | ?: |
16 | 赋值运算符 | =、 *=、 /=、 %=、 +=、 -=、 <<=、 >>=、 &=、 |=、 ^= |
17 | 逗号运算符 | , |
再来看看前面的复杂表达式:
int myNumber = 10 * 30 + 20 – 5 * 5 << 2;
计算这个表达式的结果时,需要使用上表所示的运算符优先级。由于乘法和除法的优先级高于加法和减法,而加法和减法的优先级高于移位,因此可将上述表达式简化为如下所示:
int myNumber = 300 + 20 – 25 << 2;
由于加法和减法的优先级高于移位,因此可进一步简化为如下所示:
int myNumber = 295 << 2;
最后,您执行移位运算。由于左移一位翻一番,左移两位翻两番,因此该表达式的结果为 295*4,即 1180。
警告:
使用括号可让代码易于理解。
为说明运算符优先级,前述表达式故意编写得很糟糕。对编译器来说,这个表达式很容易理解,但编写代码时,还应确保它对人来说也容易理解。
因此,将这个表达式写成下面这样要好得多:
int myNumber = ((10 * 30) – (5 * 5) + 20) << 2; //1180
应该:
务必使用括号让代码和表达式易于理解。
务必使用正确的变量类型,确保它不会溢出。
所有的左值(如变量)都可用作右值,但并非
所有的右值都可用作左值(如“Hello World”),务必要明白这一点。
不应该:
不要编写必须依靠运算符优先级表才能理解的复杂表达式;应确保代码对人来说也易于理解。
不要将++Variable 与 Variable++混为一谈,以为它们等效。用于赋值时,它们的效果不同。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程