[c语言]——运算符优先级

本文详细介绍了C语言中的运算符优先级及其结合方向,包括单目、双目及三目运算符,如算术运算符、逻辑运算符、赋值运算符等,帮助读者深入理解C语言的表达式计算规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C语言运算符优先级

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

(表达式)/函数名(形参表)

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

 

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

 

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

 

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

 

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

 

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位或后赋值

变量|=表达式

--

 

15

逗号运算符

表达式,表达式,…

左到右

--

说明:

    同一优先级的运算符,运算次序由结合方向所决定。
    简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符


 

### 关于C语言运算符优先级的练习题 理解并熟练掌握C语言中的运算符优先级对于编写高效且无误的代码非常重要。下面是一些关于C语言运算符优先级的具体练习题及其解答。 #### 练习题1:简单算术表达式求值 给定如下表达式: ```c int a = 3 * (4 + 5); ``` 此表达式中,由于圆括号`()`具有最高优先级[^4],因此会先执行其中的操作即\(4+5\)得到9;接着乘法\(*\)被执行,最终结果为27。 #### 练习题2:逻辑与按位移位混合使用 考虑这段代码片段: ```c unsigned char b = ((0x8F >> 2) & 0xF0 | 0x0A); ``` 这里涉及到右移`\>>`, 按位与`&`以及按位或`|`三个不同类型的运算符。根据它们各自的优先级,首先是右移操作被处理,之后是按位与最后才是按位或。具体来说,`0x8F`(二进制表示为`10001111`)向右移动两位变成`00100011`也就是十进制下的35, 接着跟`0xF0`做按位与获得`00100000`再和`0x0A`作按位或得出最终的结果`00101010`或者说是整数42[^3]。 #### 练习题3:自增/减与其他运算组合 分析下列语句的行为: ```c int c=1,d; d=(++c)+(c++)+(--c)-(c--); printf("%d %d\n", d,c); ``` 在这个例子里面,前置增量(`++c`)会在读取变量之前增加其值而后者置增量(`c++`)则是在访问过后才改变数值。同样地适用于前缀减少(`--c`)和后缀减少(`c--`). 执行上述命令序列后的输出将是 `6 2`. 解析过程如下: - 初始状态:c=1; - `(++c)`使c变为2,并返回新值2; - `(c++)`此时c仍等于2,在这一步结束后才会更新成3,但是此处使用的还是原来的值2; - `(--c)`将c降回至1,并立即生效; - `(c--)`再次利用当前值1作为参与计算的部分,随后降低到0. 综上所述,总和为 \(2+2+1−1=6,\quad c=0.\) #### 练习题4:条件运算符的应用 观察这个三元条件运算符的例子: ```c int e,f,g,h; e=f=g=h=1; h=e?f?g:h:e; ``` 这里的重点在于理解条件运算符(?:)的工作方式——它属于最低级别的优先级之一[^1]. 表达式的评估遵循从左往右的原则直到遇到第一个问号为止,这意味着整个表达式实际上相当于`((e)?f:(g?h:e))`. 假设所有变量都被初始化为了1,则最终赋给`h`的是`f`的值也即是1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值