单片机与物联网技术应用实战教程
上QQ阅读APP看书,第一时间看更新

5.2 运算符与表达式

运算符是传达给编译器执行某一特定的逻辑操作符号。C语言中常见的运算符种类有:算术运算符、赋值运算符、关系运算符、逻辑运算符、位操作运算符,见表5-2。在C语言中,运算符有单、双目之分,双目运算符需要两个操作数;而单目运算符只需要一个操作数。

5-2 C语言常见运算符

978-7-111-59182-5-Part01-226.jpg

5.2.1 算术运算符

算术运算符是最基本、最常见的运算符之一,用于各类的数值运算。常见的双目算术运算符包括加(+)、减(-)、乘(*)、除(/)、取余(%);常见的单目运算符包括自增(++)和自减(--)。

加法运算符“+”:如a+b;

减法运算符“-”:如a-b;

乘法运算符“*”:如a*b;

除法运算符“/”:如a/b;

取余运算符“%”:如a%b;

自增1运算符“++”:例如,i++:表示先用i进行运算,运算之后i的值加1;++i:表示i的值先加1,再进行运算。

自减1运算符“--”:例如,i--:表示先用i进行运算,运算之后i的值减1;--i:表示i的值先减1,再进行运算。

算术运算符的优先级为:先乘除,后加减,有括号时括号优先。

例如:

S=a*b+3/(c+d)

inta=4,b=3,c=2,d=1;

结果:S=13

5.2.2 赋值运算符

在C语言中,赋值运算符分为一般赋值运算符和复合赋值运算符。

最常见的一般赋值运算符为“=”,它的作用是将“=”右边的值赋值给左边的变量,例如:inta=1:表示将1赋值给整型变量a。

复合赋值运算符,是在“=”的前面加上其他的运算符,从而构成复合赋值运算符。例如:

+=:加法赋值运算符;例如:a+=1等效于a=a+1

-=:减法赋值运算符;例如:a-=1等效于a=a-1

*=:乘法赋值运算符;例如:a*=1等效于a=a*1

/=:除法赋值运算符;例如:a%=1等效于a=a%1

5.2.3 关系运算符

关系运算符一般用于数值之间进行比较时的运算,通常用于判断某个条件是否成立以执行后续的程序。关系运算符包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)。

关系运算符的输出只有0和1。当条件成立时,输出为1;当条件不成立时,输出为0。注意:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)的优先级相同,且高于等于(==)和不等于(!=)。

5.2.4 逻辑运算符

逻辑运算符通常用于逻辑运算。C语言中常用的逻辑运算符为:与(&&)、或(||)、非(!)。其中,与(&&)、或(||)都是双目运算符,非(!)为单目运算符。优先级为逻辑非>逻辑与>逻辑或。

a&&b:a和b两边的表达式同时成立,输出为1(真);否则为0(假)。

a||b:a的表达式成立或者b的表达式成立,输出为1(真);否则为0(假)。

b=!a:当a为1(真)时,b为0(假);当a为0(假)时,b为1(真)。

例如:3>2||2>7:输出结果为1(真)。因为左边3>2成立,右边2<7不成立,而非(||)表示只要有一边满足即为真。

5.2.5 位操作运算符

C语言中的位操作运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>)6种。位运算符的逻辑真值表见表5-3。

5-3 位运算符的逻辑真值表

978-7-111-59182-5-Part01-227.jpg

位取反运算符~:

例如:unsigned char x=0x9a,y;

y=~x;

结果:y=0x65,x=0x9a

位左移运算符<<:左移1位相当于乘以2。左移运算中高位移出舍弃不用,低位自动补0。

例如:unsigned char x=15;

x=a<<1;

结果:x=30

位右移运算符>>:右移1位相当于除以2。右移运算中低位移出舍弃不用,高位对无符号数补0。

5.2.6 指针运算符

指针在C语言中是一个非常重要的概念,C语言之所以灵活,很大一部分体现在程序中对指针的灵活运用。在单片机的程序书写当中,指针运用得当会使复杂的程序变得简单易懂,因此,善于使用指针,是学习单片机C语言中的一个难点部分。

1.指针定义

指针用于存放变量的地址,该地址是另一个变量在内存中存储的位置。指针本身也是一种变量,和其他变量一样,要占有一定数量的存储空间,用来存放指针值(即地址)。

指针定义一般形式为:

数据类型*指针变量名;

其中,数据类型:表示该指针变量所指向变量的类型。

指针变量名:定义指针变量的名字。

例如:

int*seong;指针变量seong是指向int类型变量的指针。

注意区分变量的指针和指针变量:变量的指针是变量的地址,而一个指针变量存放的内容是另一个变量在内存中的地址,拥有这个地址的变量为该指针变量所指向的变量。每一个变量都有自己的指针(称为地址),每一个指针变量指向另一个变量。

例如:整型变量x的地址50H存放在指针变量seong中,可用*seong表示指针变量seong指向的变量,即*seong表示变量x。

2.指针运算符&和*

指针变量中只能存放地址,基本的运算符是&和*。

1)&:表示取地址运算符,返回变量的内存地址。只能用于一个具体的变量或数组元素,不可用于表达式。

例如:

int*m;

intn;

m=&n;

说明将整型变量n的地址赋值给指针变量m。

2)*:表示指针运算符,返回地址中的变量值。

例如:

int*m;//指针变量定义

intn;

intv;

m=&n;//&t中的&为取n的地址赋值给m。

v=*m;//将指针变量m指向的变量值赋给v。

在指针赋值时注意几点:

①指针使用之前,未初始化的指针变量不可以使用。

②赋值语句中,变量的地址只能赋给指针变量本身。