目录
- 一、复杂表达式求值顺序
- 1.操作符的优先级
- 2.操作符的结合性
- 3.操作符是否控制执行的顺序
- 二、求值顺序
- 三、操作符优先级和结合性列表
一、复杂表达式求值顺序
复杂表达式的求值顺序由三个因素决定:
1.操作符的优先级
2.操作符的结合性
3.操作符是否控制执行的顺序
1.操作符的优先级
两个相邻的操作符哪个先执行取决于操作符的优先级 如果两者优先级相同,那么他们的执行顺序由结合性决定。(从左向右计算还是从右向左计算)。
需要注意的是,有4个操作符,可以对整个表达式的求值顺序施加控制,这4个操作符为 “,” “&&” “||” “?:”。
操作符优先级如末尾附表所示。它只是决定表达式的各个组成部分在求值过程中如何聚组。
2.操作符的结合性
操作符的结合性表示是从左向右求值还是从右向左求值。
3.操作符是否控制执行的顺序
是否控制执行顺序表示,保证某个子表达式能够在 另一个子表达式所有求值过程完成之前
进行求值。即保证某个子表达式先于另一个子表达式求值。或者完全跳过某个表达式,不对其进行求值。
操作符会对其操作数提出要求,要求其为左值或右值。
左值意味着一个位置,右值意味着一个值,所以,在可以使用右值的地方可以使用左值,但是需要使用左值的地方不能使用右值!
左值是可以出现在赋值符号“=”左边的东西。
右值是可以出现在赋值符号“=”右边的东西。
二、求值顺序
除了两个运算符共享一个运算对象的情况外,C语言不保证先对复杂表达式的哪一部分求值。
举例:
a = (2+3)*(5+8);
对*的左右侧两个子表达式,对谁先求值都是有可能的。
复杂表达式求值顺序举例:
a+b*c
*操作符的优先级高于+,编译器别无选择,只能先执行乘法运算。
a*b+c*d+e*f
如果仅由优先级决定,三个乘法运算将先于加法运算,但实际上并不一定是这样,第一个加法运算可以能先于第三个乘法运算,实际上只要保证每个乘法运算在它相邻的加法运算之前执行即可。
加法运算的结合性要求加法运算按照先左后右的顺序执行,但是它对表达式剩余部分的执行顺序并未加以限制。
对于上式,没有任何规则要求所有的乘法运算需要先执行。也没有规定这几个乘法运算之间谁先进行。
优先级规则在这里不起作用,优先级只对相邻操作符的执行顺序起作用。
三、操作符优先级和结合性列表