5.2 运算符与表达式
运算符是传达给编译器执行某一特定的逻辑操作符号。C语言中常见的运算符种类有:算术运算符、赋值运算符、关系运算符、逻辑运算符、位操作运算符,见表5-2。在C语言中,运算符有单、双目之分,双目运算符需要两个操作数;而单目运算符只需要一个操作数。
表5-2 C语言常见运算符
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 位运算符的逻辑真值表
位取反运算符~:
例如: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。
在指针赋值时注意几点:
①指针使用之前,未初始化的指针变量不可以使用。
②赋值语句中,变量的地址只能赋给指针变量本身。