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、关于优先级可简单记为:算术运算符 > 关系运算符 > 逻辑运算符 >位运算符> 赋值运算符。逻辑运算符中“逻辑非 !”除外,以及位运算符中"按位取反运算符 ~"除外。

C语言运算符的优先级如下所示: 1. 后缀运算符:() \[\] -> 2. 一元运算符:++ -- + - ! ~ (type)* & sizeof 3. 乘除余运算符:* / % 4. 加减运算符:+ - 5. 移位运算符:<< >> 6. 关系运算符: < <= > >= 7. 相等运算符:== != 8. 位与运算符:& 9. 位异或运算符:^ 10. 位或运算符:| 11. 逻辑与运算符:&& 12. 逻辑或运算符:|| 13. 条件运算符:?: 14. 赋值运算符:= += -= *= /= %= >>= <<= &= ^= |= 15. 逗号运算符:, 需要注意的是,运算符的优先级决定了它们在表达式中的计算顺序。在表达式中,较高优先级的运算符会优先被计算。例如,对于表达式e = (a + b) * c / d,先计算括号内的加法,然后乘法,最后除法。\[1\]\[2\] 另外,C语言中还有一些特殊的运算符,如sizeof运算符用于获取变量或类型的大小,逗号运算符用于依次计算多个表达式并返回最后一个表达式的值。\[2\] 总结起来,C语言运算符的优先级可以根据上述优先级表来确定,根据需要可以使用括号来改变运算的顺序。\[2\] #### 引用[.reference_title] - *1* *2* [C语言——运算符优先级](https://blog.csdn.net/liu17234050/article/details/104176911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【C语言基础】-运算符](https://blog.csdn.net/weixin_44247448/article/details/124077281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值