3.8.11 运算符优先级和结合性

在C51语言中,当一个表达式中有多个运算符参与运算时,要按照运算符的优先级别进行运算。在复杂的表达式中,除了要判断运算优先级外,还要考虑结合性或者关联性。

1.算术运算符的优先级

算术运算符的优先级由高到低依次为自增自减(++、—)和取负(-)、乘法除法(*、/)和取模(%)、加和减(+、-)。

这里需要强调的是,在C51程序编译时对同级运算符一般按从左到右的顺序进行计算,由于括号的优先级最高,所以括号会改变计算顺序。

2.关系运算符和逻辑运算符的优先级

关系运算符和逻辑运算符的相对优先级最高的是!,其次是>、<、>=和<=,然后是==和!=,后面是&&,最后是||。关系运算符和逻辑运算符的优先级符合以下两点(表3.9)。

❑关系和逻辑运算符的优先级比算术运算符低,像表达式10>1+12和表达式10>(1+12)计算的结果是一样的。

❑在关系或逻辑表达式中可以使用括号来修改原计算的优先级顺序。

3.运算符的结合性

在一个复杂的表达式中,常常有许多运算符和变量,除了要判断优先级外,还要考虑结合性。C51语言中具有“左结合性”和“右结合性”的概念。左结合性即变量(或常量)与左边的运算符结合。右结合性即变量(或常量)与右边的运算符结合。示例如下。


-6+23;


3.8.11 运算符优先级和结合性 - 图1

其中,运算符“-”和“+”相对于运算的操作数来说是“左”结合的,所以实际参与计算的是“-6”和“+23”,即相当于(-6)+(23)运算的结果为17。

运算符优先级和结合性的顺序如表3.9所示,表中优先级从上往下逐渐降低,同一行优先级从左往右逐渐降低。

从表中可以看出,C51语言中具有右结合性的运算符包括所有单目运算符以及三目运算符,其他都是左结合性,知道这个规律可以很方便地记住运算符的结合性。

为了程序移植、防止歧义和阅读的方便,在实际程序设计中,如果代码行中的运算符比较多,应当多用括号确定表达式的操作顺序,避免使用默认的优先级。示例如下。


(num<<4)|a//用括号把需要先运算的括起来

(a|c)&&(b&c)//用括号把需要先运算的括起来


4.程序示例

关于运算符优先级和结合性的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

int a=5;//定义整型变量

a%=9-2;//联合操作

printf(“a=%d\n”,a);//输出结果

a+=a/=a*=2;//复杂的运算

printf(“a=%d\n”,a);//输出结果

}


该程序可在KeilµVision3集成开发环境中运行,执行结果如下。


a=5

a=0


本例中,由于“%”和“=”运算符的优先级别低于“—”运算符,a%=9-2即a%=7,等价于a=a%7即a=5%7=5。表达式a+=a/=a=2,开始时a=5,表达式赋值是从左至右进行的,表达a=2使得a=10,此表达式的值也为10。接着a/=a=2。相当于a/=10,也就是a=a/10,因此,a=0。最后,表达式a+=a/=a=2相当于a+=0,也就是a=a+0=0,所以最终a的值为0。