21.操作符优先级和结合性列表,复杂表达式求值顺序

文章详细阐述了复杂表达式求值顺序的决定因素,包括操作符的优先级、结合性和是否控制执行顺序。优先级高的操作符先执行,相同优先级时由结合性决定。逗号操作符、逻辑与(&&)、逻辑或(||)以及条件操作符(?)可以控制执行顺序。C语言不保证对表达式哪一部分先求值,只有操作符相邻时才按优先级和结合性确定。

一、复杂表达式求值顺序

复杂表达式的求值顺序由三个因素决定:
1.操作符的优先级
2.操作符的结合性
3.操作符是否控制执行的顺序

1.操作符的优先级

两个相邻的操作符哪个先执行取决于操作符的优先级 如果两者优先级相同,那么他们的执行顺序由结合性决定。(从左向右计算还是从右向左计算)。

需要注意的是,有4个操作符,可以对整个表达式的求值顺序施加控制,这4个操作符为 “,” “&&” “||” “?:”。

操作符优先级如末尾附表所示。它只是决定表达式的各个组成部分在求值过程中如何聚组。

2.操作符的结合性

操作符的结合性表示是从左向右求值还是从右向左求值。

3.操作符是否控制执行的顺序

是否控制执行顺序表示,保证某个子表达式能够在 另一个子表达式所有求值过程完成之前
进行求值。即保证某个子表达式先于另一个子表达式求值。或者完全跳过某个表达式,不对其进行求值。

操作符会对其操作数提出要求,要求其为左值或右值。
左值意味着一个位置,右值意味着一个值,所以,在可以使用右值的地方可以使用左值,但是需要使用左值的地方不能使用右值!
左值是可以出现在赋值符号“=”左边的东西。
右值是可以出现在赋值符号“=”右边的东西。

二、求值顺序

除了两个运算符共享一个运算对象的情况外,C语言不保证先对复杂表达式的哪一部分求值。

举例:

a =2+3*(5+8);

对*的左右侧两个子表达式,对谁先求值都是有可能的。

复杂表达式求值顺序举例:

a+b*c

*操作符的优先级高于+,编译器别无选择,只能先执行乘法运算。

a*b+c*d+e*f

如果仅由优先级决定,三个乘法运算将先于加法运算,但实际上并不一定是这样,第一个加法运算可以能先于第三个乘法运算,实际上只要保证每个乘法运算在它相邻的加法运算之前执行即可。
加法运算的结合性要求加法运算按照先左后右的顺序执行,但是它对表达式剩余部分的执行顺序并未加以限制。
对于上式,没有任何规则要求所有的乘法运算需要先执行。也没有规定这几个乘法运算之间谁先进行。
优先级规则在这里不起作用,优先级只对相邻操作符的执行顺序起作用。

三、操作符优先级和结合性列表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiawucha159

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值