C与C++运算符优先级个人解读

66 篇文章 0 订阅

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:http://c.biancheng.net/view/161.html
参考:https://blog.csdn.net/yuliying/article/details/72898132

引言

没有想到,在写了许多年代码之后,对几个运算符优先级竟然没有记对。
还好平时多用括号,要不代码该出许多问题了。
但优先级还是要能分的清楚的,毕竟看代码的时候,会涉及到未用括号分割的情况。

运算符优先级归类:

  1. 结合类运算符 > 单目运算符 > 算数运算(乘除余>加减) >
  2. 位移 > 比较(大于小于>等于不等于) > 其它逻辑运算(& > ^ > | > && > ||) >
  3. 三目条件运算(? x:y ) > 赋值 > 逗号运算符

(部分归类有合并,仅供参考)

1. 结合类优先级最高:

分别是

[] 数组下标,
() 括号,
. 结构体成员选择,
->指针成员选择

备注:
1- 结合方向从左往右,优先级同级参考结合方向
个人见解:
1-. 这块没有想到的是,成员选择(. 与 ->)的优先级这么高

2. 单目运算符优先级次高:(结合方向:从右往左)

分别是:

- 负号运算符
(int/..) 强制类型转换
++ 自增
-- 自减
* 指针取值运算符
& 取地址运算符
! 逻辑非
~ 按位取反
sizeof 长度运算符

备注:
1- 结合方向从右往左,从右往左哦!优先级同级参考结合方向
见解:
1- 单目运算符优先级挺高知道,不过像(int/…)强制类型转换也是单目运算符,sizeof也是单目运算符,确实是没想到的哈! (sizeof–我当你是函数,谁知你竟然是运算符!)
2- 逻辑非(!)与按位取反(~),原来以为他们都是位取值运算符,和 & | ^ 这几个类似,其实相差特别大:一个站在第二等阶优先级,一个是站在乘除加减、左移右移、大于小于等于之后;
逻辑非用的还比较多,例如在if语句中,非得优先级比较大可以确保其先执行
if (!p && !q) // 判定两者均不为空
3- 负号也是一个运算符,这个蛮意外的,原以为它是数字的一部分,但实际它是一个单目运算符哈。另外这个要和减号做好区分,长得一样,但所在位置决定了它是负号还是减号。

3. 第三高是算数运算符:
算数运算符-乘除余:
/ 除号
* 乘号
% 求余符号
接下来是算数运算符-加减:
+ 加号
- 减号

备注:
1-. 结合方向从左往右,优先级同级参考结合方向,不同级按照级别大小
见解:
1-. 求余运算一直觉得不高,结果还挺高的,竟然比±还高,和*/是一个级别的

4. 接下来是左移右移:
<< 左移
>> 右移

备注:
1-. 结合方向从左往右,优先级同级参考结合方向
见解:
1-. 一直觉得,像左移右移这种,优先级应该会很高,会比算数运算符高;
实际确实也挺高,比比较运算符高、比除单目外的逻辑运算高,比赋值运算符高,但却是比算术运算符低的。
相比而言,算数运算符yyds。

5. 然后是比较运算符:

再然后是比较运算符-大于小于:

> 大于
>= 大于等于
< 小于
<= 小于等于

再然后是比较运算符-等于不等于:

== 等于
!= 不等于

备注:
1-. 结合方向从左往右,优先级同级参考结合方向,不同级按照级别先后
见解:
1-. >< >= <= 优先级高于 == !=

6. 其它逻辑运算符:(& > ^ > | > && > ||)
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或

备注:
1- 结合方向从左往右,优先级这几个级别依次是: & > ^ > | > && > ||
见解:
1-. 这些逻辑运算符(除单目运算符!~外的) 优先级小于 比较运算符很重要,很多时候写的if语句多个条件时,没有多加括号,就由它来确保正确性的。
例如:if (a > b && a > c) // 判断 a

7. 下来是三目运算符,仅此一个: (结合方向从右往左)
? x:y 条件运算

备注:
1-. 结合方向从右往左,注意从右往左
见解:
1-. 条件运算也算是一个奇葩运算符了,就这一个运算符是三目的,并且结合是从右往左,并且一个运算符就形成了分支结构;
我们知道程序的主要结构三种:顺序、分支、循环;一个运算符就带了分支还是蛮奇特的;

8. 接下来是各种赋值:
= 赋值
/=, *=, %=, +=, -=,  除后/乘后/取余后/加后/减后 赋值
<<=, >>= 左移后/右移后 赋值
&=,^=, |= 按位 与后/异或后/或后 赋值

备注:
1-. 结合方向从左往右,优先级同级参考结合方向
见解:
1-. 注意看到,所有的赋值操作优先级都不高哦,带了 算数运算符、带了左移右移 也不例外,带了赋值优先级就基本上是最低了(仅比逗号高)
2-. 注意到有按位的这几种取值赋值 &=,^=, |=,但是没有!=非等,没有~=取反等,为什么呢?
因为压根 非、取反 不需要右边,单目就够了;
而有的这几个都是双目的,需要右边一起计算。

9. 最后一个,优先级最低的逗号:
, 逗号

备注:
1-. 结合方向从左往右,
见解:
1-. 逗号也是运算符啊?好吧,你赢了!
2-. 逗号是优先级最低的运算符了,例如下面这种:
int a = (1, 2, 3); // a最终赋值3,结合方向从左往右,最终选择最后一个值输出
int b = 1, 2, 3; // 和上面效果一样,b也是结果3

总体特点

总体上有几个特殊的项:
结合方向上从右往左的项:单目运算符 、 仅此一家的三目运算符?: 与 赋值运算符

总体上有一个规则要遵从:
优先级同级参考结合方向,不同级按照级别先后

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值