51单片机c语言运算优先级表 (c语言运算符和表达式的学习讲解)

大家好,今天和大家探讨的是单片机C语言中的运算符和表达式。

前边介绍了C语言中的变量的表示,然而在计算的过程中只有变量是不能完成计算的,因此运算符和表达式为变量(包括常量)来做特定的操作,来实现数据的运算,因此运算符和表达式是C语言中不可或缺的部分。这节课我们主要介绍在运算中变量操作的运算符和表达式,并举例说明单片机C语言中常用的运算符和表达式。

Ø 表达式

在C语言中表达式指的是:用运算符将运算对象(一般是变量)连接起来。运算对象也成为是被运算量,它可以是数字,字符,甚至是函数。而表达是就是将这些被运算量通过运算符连接起来。常用的形式就是运算符+运算对象;比如:F(x)是一个运算公式,而a是一个变量,那么F(a)就是一个运算表达式;

Ø 运算符

常用的运算符主要有(下面还有很多衍生的符合运算符等):

+ - * / % ++ --
> < >= <= == != =
! || && ^ ~ I &
>> << () [] {} ?: ,
-> sizeof .

根据运算变量的个数可以分为单目运算符和多目运算符,单目运算符指的是运算符的操作变量只有一个,而多目运算符的操作变量可以是两个、三个或者多个。比如:逻辑非运算符 !、按位取反运算符~、自增自减运算符++, --、负号运算符-、类型转换运算符(类型)、指针运算符和取地址运算符*和&、长度运算符sizeof,这些都是对单个变量进行操作的,因此为单目运算符。

在很多的情况下对变量的运算不是只用一种操作来完成的,这就会涉及在运算中那些先算那些后算,也就是运算符的优先级的问题,在通常情况下运算符的优先级如下表所示:

优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右 NA
() 圆括号 (表达式)/函数名(形参表) NA
. 成员选择(对象) 对象.成员名 NA
-> 成员选择(指针) 对象指针->成员名 NA
2 - 负号运算符 -表达式 右到左 单目运算符
~ 按位取反运算符 ~表达式
++ 自增运算符 ++变量名/变量名++
-- 自减运算符 --变量名/变量名--
* 取值运算符 *指针变量
& 取地址运算符 &变量名
! 逻辑非运算符 !表达式
(类型) 强制类型转换 (数据类型)表达式 NA
sizeof 长度运算符 sizeof(表达式) NA
3 / 表达式/表达式 左到右 双目运算符
* 表达式*表达式
% 余数(取模) 整型表达式%整型表达式
4 + 表达式+表达式 左到右 双目运算符
- 表达式-表达式
5 << 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式
< 小于 表达式<表达式
<= 小于等于 表达式<=表达式
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1?表达式2: 表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左 NA
/= 除后赋值 变量/=表达式 NA
*= 乘后赋值 变量*=表达式 NA
%= 取模后赋值 变量%=表达式 NA
+= 加后赋值 变量+=表达式 NA
-= 减后赋值 变量-=表达式 NA
<<= 左移后赋值 变量<<=表达式 NA
>>= 右移后赋值 变量>>=表达式 NA
&= 按位与后赋值 变量&=表达式 NA
^= 按位异或后赋值 变量^=表达式 NA
|= 按位或后赋值 变量|=表达式 NA
15 逗号运算符 表达式,表达式,… 左到右 NA

下面对运算符进行简单的解释。

1.赋值运算符=(注意这个和==的区别),在C语言中一个等号(=)表示赋值,它是双目的运算符,需要在运算符的两边都有变量,因此其形式为:

变量=表达式

其表达式,就像我们前面介绍的,可以是简单的也可以是复杂的,比如前面介绍的表达式F(x),我们就要将这个运算的结果赋给变量b,那么就是可以写成b=F(a);赋值运算符在C语言中出现的频率是最高的

2. 算术运算符,顾名思义算术运算符就是我们对数字进行的运算,主要包括+、-、*、/、%等,注意这是最基本的运算符,开方、取对数这些运算都是比较复杂的运算,一般都是由函数构成的,因此如果需要这些运算还得通过基本的运算来实现,也就是构建函数。在这里也没有什么特别难理解的,需要注意的一点的是在单片机C语言中,经常会用到数目管显示,有时候需要将采集的数据分成单个的数字,比如将1234,分成1、2、3、4,这样单个数字分别显示在数码管上,在这里我们经常用/和%来实现(当然里面也有强制数据类型转换的观点)。比如将1234分解成1、 2、 3、 4;假设定义一个数组缓存来存放这四个数据,

unsigned char databuff[4];

databuff[0]=1234/1000; //1

databuff[1]=1234/100%10;//2

databuff[2]=1234/10%100;//3

databuff[3]=1234%1000;// 4

这样就可以将1234进行分解,从而得到了每一位数据。

3. 关系运算符

关系运算符主要有==、<=、>=、!=这四个运算符属于双目运算符,用来表示变量与变量之间,变量与表达式,表达式与表达式之间的关系,通常在判断的语句中及常用到,在这里主要注意的是==和=的区别,在初学者中这两个符号经常搞混或者将赋值符号(=)误当做等于(==)来处理,这样有时候编译器不会报错,但得到的结果却和设计的结果有很大的出入,希望注意。

4、逻辑运算符。

在单片机中经常用到逻辑运算,比如事件的发生(最终转化为信号的产生),很多的时候我们根据这些时间的逻辑关系来判断后面的事件是否发生,因此逻辑运算是在单片机中常用到的运算;在单片机中除了逻辑关系的运算以外还可以是数据的运算。

比如&和&&的关系,都表示逻辑与的关系,当用于表达式1 & 表达式2 和表达式1 && 表达式2的时候,都表示当两边的表达式为真的时候,整个结果才是真。在这里&&有短路的功能,就是当判断表达式1为真的时候才去判断表达式2,如果表达式1是假的那么就不会再去判断表达式2,整个表达式就是假的,这样可以节省时间,一般在设计的的时候我们先把容易判断出错的放在前边,这样可以节省程序的运行时间。同样|和||在同样的表达的时候是相同的原理。

对于&还有一个功能就是按位与的功能,就是将两个非单字节的变量进行按位与的运算,比如0x11&0xff 运算的结果就是0x11;有了这个运算我们就可以单独的开启和屏蔽字节中的特定的位了(根据我们的选择)。比如,我只获取变量a(8位的)中的最低位,那么我们就可通过a&0x01来得到a的最低位。同样的原理也适用于|和||。

5. 符合运算符。

有的时候为了简洁,我们将复制表达式和元算符进行合并就出现了类似以下的表达:+=、-=、*=、/=、%=、|=、&=、<<=、>>=、等符合运算的符号通常为 变量A+符合运算符 B,比如a+=5实际表示a=a+5;同样的道理a<<=5;和 a=a<<5一样的,就是说a中的每一位向右移动5位。

6. 自增自减运算符。

i++(1--)、++i(--i)

在自增运算符中有i++型的和++i型的,那么他们的区别是i++是说使用变量后,i才会加1;而++i表示在使用变量i之前先进行加1,比如下面的例子:

i=1;

a=i++;

那么a等于1

但是如果:

i=1;

a=++i;

那么a就等于2

这是在程序中要注意的,特别是在循环的时候会出现越界的情况这样就会得到不想得到的结果。

6. 至于?:条件运算符和逗号运算符在单片机C语言中用到的次数比较少,因此在这里就不着重介绍了,有兴趣的可以自己看看,用得少不等于不用,有的时候还是会有很大的帮助的。

那么今天回顾一下我们主要的内容就是介绍了表达式和运算符在C语言中的表述。有了这些运算符我们就可以根据我们的需要将数字量进行运算从而得到输出量来控制我们要控制的信号(也就是控制的对象)。从另一方面来讲,这些基本的运算符和表达式构成是构成函数的基本元素(在一个就是下节要介绍的语句)。因此,知道了C语言的表达式和运算符就基本可以对变量进行运算了。这是本小结讲的内容,谢谢大家!

更多C语言基础入门连载,请关注云汉电子社区*今条头日**号!