C 运算符优先级——位运算符和逻辑运算符

C 运算符优先级——位运算符和逻辑运算符

  在进行C语言开发时,若单条表达式用到的运算符过多,需要注意运算符的优先级,否则无法得到欲得到的结果,最显而易见的便是“先算乘除,后算加减”。
  说说我遇到的问题吧:在if中判断某一个字符&0x80后是否等于0,一开始我是这么写的:

if (data & 0x80 == 0) 
{
	//code
	...
}

  结果发现明明字符data最高位为0,但依然无法进入if语句块,而单独输出data & 0x80时,其输出结果为0,于是猜想可能是&运算符的优先级低于==,将代码改为:

if ((data & 0x80) == 0) 
{
	//code
	...
}

  结果便正常了,从而确定&运算符的优先级低于==,在一开始的代码中,会先计算0x80 == 0,得到值为0,而后计算data & 0,这样无论data为什么值,得到的结果都是0,最终也就是if(0),所以无法进入if语句块。
  经网上查阅,整理C 运算符优先级表如下:

优先级运算符名称或含义使用形式结合方向说明
1[]数组下标数组名[常量表达式]左到右
()圆括号(表达式)/函数名(形参表)
.成员选择(对象)对象.成员名
->成员选择(指针)对象指针->成员名
2-负号运算符-表达式右到左单目运算符
(类型)强制类型转换(数据类型)表达式
++自增运算符++变量名/变量名++单目运算符
--自减运算符--变量名/变量名--单目运算符
*取值运算符*指针变量单目运算符
&取地址运算符&变量名单目运算符
!逻辑非运算符!表达式单目运算符
~按位取反运算符~表达式单目运算符
sizeof长度运算符sizeof(表达式)
3/表达式/表达式左到右双目运算符
*表达式*表达式
%余数(取模)整型表达式/整型表达式
4+表达式+表达式左到右双目运算符
-表达式-表达式
5<<左移 变量<<表达式左到右双目运算符
>>右移 变量>>表达式
6>大于 表达式>表达式左到右双目运算符
>=大于等于表达式>=表达式
<小于表达式<表达式
<=小于等于表达式<=表达式
7==等于表达式==表达式左到右双目运算符
!=不等于表达式!= 表达式
8&按位与表达式&表达式左到右双目运算符
9^按位异或表达式^表达式左到右双目运算符
10 |按位或表达式|表达式左到右双目运算符
11 &&逻辑与表达式&&表达式左到右双目运算符
12 ||逻辑或表达式||表达式左到右双目运算符
13?:条件运算符表达式1? 表达式2: 表达式3右到左三目运算符
14=赋值运算符 变量=表达式右到左
/=除后赋值 变量/=表达式
*=乘后赋值 变量*=表达式
%=取模后赋值变量%=表达式
+=加后赋值 变量+=表达式
-=减后赋值 变量-=表达式
<<=左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&=按位与后赋值 变量&=表达式
^=按位异或后赋值 变量^=表达式
|=按位或后赋值 变量|=表达式
15,逗号运算符 表达式,表达式,…左到右从左向右顺序运算

  关于上表的一些说明:
  1、优先级由1至15逐渐降低。
  2、结合方向指:在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。
  3、关于优先级可简单记为:算术运算符 > 关系运算符 > 逻辑运算符 >位运算符> 赋值运算符。逻辑运算符中“逻辑非 !”除外,以及位运算符中"按位取反运算符 ~"除外。

  • 14
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值