目录
5.1 算术运算
5.1.1 基本的算术运算符
正号运算符“+”:正号运算符为单目运算符,即只有一个量参与运算,如+1、+a。
负号运算符“-”:负号运算符为单目运算符,如-5.2、-b。
加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算,如a+b、3+2。
减法运算符“-”:减法运算符为双目运算符,如5-2。
乘法运算符“*”:乘法运算符为双目运算符,如2*5。
除法运算符“/”:除法运算符为双目运算符,如7/2。
模运算符(或称取余运算符“%”):为双目运算符,如7%3。结果等于两数相除后的余数,如7%3结果是1而不是2。
5.1.2 算术表达式
由算术运算符和运算对象构成的表达式称为算术表达式。圆括号()允许出现在任何表达式中。例如:(s1+s2)/2、a%b、sqrt(b*b+a*c)。
注意:①求余运算%只适用于int型数据,运算结果是两个整数相除的余数,判断一个整数是否是另一个数的整数倍时,通常用求余运算;②两个整数进行除法运算时,结果为“商”的值,即只保留除法结果的整数位,例如38/10,其结果是3。
5.1.3 算术运算符的优先级和结合性
运算符的优先级是指不同运算符在表达式中的运算顺序。
(1)规定负号运算符(-)优先级高于乘、除、模运算符,乘、除、模运算符优先级高于加、减运算符,当有括号()时,括号优先级最高。表达式a-b*c,乘号优先于减号,相当于a-(b*c)。
(2)如果在一个运算对象两侧的运算符优先级别相同,如表达式a-b+c,减号和加号优先级别相同,则按规定的“结合方向”处理。结合方向有两个:左结合以及右结合,算术运算符+、-、*、/、%的结合性是左结合。表达式3*7%6的值是3。
5.1.4 编程验证
计算并编程验证x-3*-7/(int)(1.3+y)+2的结果,其中x=1.4,y=3.1。代码如下:
#include <stdio.h>
int main()
{
float x=1.4,y=3.1;
printf("%f", x-3*-7/(int)(1.3+y)+2);
return 0;
}
运行结果:8.400000
5.2 赋值运算
5.2.1 赋值运算符
(1)简单赋值运算:运算符为“=”,其作用是将赋值运算符右边的表达式的值赋给左边的变量。如a=7是将7赋给变量a。
(2)复合赋值运算
常用的复合赋值运算符有5种,即+=、-=、*=、/=和%=。
加赋值运算符“+=”:如a+=(1+3),等价于a=a+(1+3)。
减赋值运算符“-=”:如a-=(1+3),等价于a=a-(1+3)。
乘赋值运算符“*=”:如a*=(1+3),等价于a=a*(1+3)。
除赋值运算符“/=”:如a/=(1+3),等价于a=a/(1+3)。
取余赋值运算符“%=”:如a%=(1+3),等价于a=a%(1+3)。
复合赋值运算的表示形式:变量op=表达式。其中,op代表运算符,=两侧的变量必须是同名变量。
在上述表示形式中,“表达式”不管多复杂,总是作为一个整体与op左侧的变量进行op运算。例如a*=b+20对应展开形式是a=a*(b+20)。
复合赋值运算符的作用是先将复合运算符右边表达式的结果与左边的变量进行算术运算,然后再将运算结果赋给左边的变量。
5.2.2 赋值运算符的优先级和结合性
(1)赋值运算符的优先级高于逗号运算符,而低于其他所有运算符。
(2)赋值运算符的结合性是右结合的。
5.2.3 赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。最基本的赋值表达式的一般形式:变量=表达式。
5.2.4 编程验证
代码如下:
#include <stdio.h>
int main()
{
int x=5,y=4;
printf("%d\n",x+=x-=x*x);
printf("%d\n",y+=y-=y*=y);
return 0;
}
运算步骤:①x*x结果25,x=x-25结果为-20,x=x+x结果为-40;②y=y*y结果y为16,y=y-y结果为0,y=y+y结果y=0。
运行结果:
-40
0
5.3 变量自增、自减运算
自增、自减运算符主要用于给一个变量加1或减1。运算符及其功能如下:
自增运算符“++”:如i++,++i,等同于i=i+1。
自减运算符“--”:如i--,--i,等同于i=i-1。
自增、自减运算符放在变量之前时,表示变量先变化,后使用;放在变量之后时,表示变量先使用,后变化。如:当n=5时,执行语句i=n++(++在后),n的值先赋值给i,i=5,n再自增1,n=6;而执行语句i=++n(++在前),n先自增1,n=6,再赋值给i,i=6。
注意:自增和自减运算符只能用于变量,而不能用于常量或表达式,如3++或者(x+y)--都是不合法的。
5.4 逗号运算
用逗号运算符连接的表达式称为逗号表达式。它的一般形式为:表达式1,表达式2,…,表达式
逗号表达式的运算过程是先算表达式1,再算表达式2,依次算到表达式n。整个表达式的值是最后一个表达式的值。例如:表达式1+a,b=5/2的值为2。
逗号运算符是所有运算符中级别最低的。
在许多情况下,使用逗号运算符的目的是要分别得到各表达式的值,而并非一定要使用整个逗号表达式的值。
注意:C语言程序中并不是在任何位置出现的逗号都是逗号运算符。例如函数中的参数是用逗号分隔,但它们并不是逗号运算符。
5.5 关系运算
5.5.1 关系运算符
C语言有以下6种关系运算符:
<:小于运算符,如a<6。
<=:小于等于运算符,如0<=3。
>:大于运算符,如a>b。
>=:大于等于运算符,如a>=5。
==:等于运算符,如x==(y+1)。
!=:不等于运算符,如z!=0。
5.5.2 关系运算符的优先级和结合性
(1)<、<=、>、>=的优先级相同,==、!=的优先级相同,前4种的优先级高于后两种。例如,3!=1>3,“>”优先级高于“!=”,1>3结果为0,3!=0结果为1,所以这个式子的值为1。
(2)关系运算符优先级小于算术运算符。例如,4>2-1,“-”优先级高于“>”,所以先计算2-1,结果为1,再计算4>1,最终结果为1。
(3)关系运算符的结合性为左结合性,即从左至右。例如:3>2>1,先计算3>2,成立则结果为1,再计算1>1,关系不成立,最终结果为0。
5.5.3 关系表达式
关系表达式是用关系运算符连接起来的式子。
5.5.4 编程验证
代码如下:
#include <stdio.h>
int main()
{
int a=4,b=3,c=1,result=2;
printf("%d\n",a<=b);
printf("%d\n",a==b+c);
result=a>b>c;
printf("%d\n",result);
return 0;
}
运行结果:
0
1
0
5.6 逻辑运算
5.6.1 逻辑运算符
C语言提供的逻辑运算符有以下3种:
(1)逻辑与运算符“&&”。这是双目运算符,要求有两个运算对象,可以表示成“条件1&&条件2”。只有当条件1成立并且条件2也成立时,逻辑与成立,结果为真,即值为1,其余情况结果都为假,即值为0。
(2)逻辑或运算符“||”。这是双目运算符,要求有两个运算对象,同样可以表示成“条件1||条件2”。当条件1成立或者条件2成立时,逻辑或成立,结果为真,即值为1,其余情况结果为假,即值为0。
(3)逻辑非运算符“!”。这是单目运算符,可以表示成“!条件”。当条件成立时,逻辑非的运算结果为假,即值为0;反之当条件不成立时,运算结果为真,即值为1。
注意:
(1)在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的值时,才执行该运算符。
(2)a&&b&&c。只有a为真(非0)时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。也就是说,只要a为假,整个表达式即为假,没必要再判断b和c;只要a为真,但b为假,就没必要再判断c。
(3)a||b||c。只要a为真(非0),整个表达式即为真,就不必判断b和c;如果a为假,才判断b,如果b也为假,才需要判断c。
5.6.2 逻辑运算符优先级和结合性
(1)n! > && > ||
(2)和其他运算符相比,“!”高于算术运算符,“&&”和“||”低于关系运算符。
5.6.3 编程验证
代码如下:
#include <stdio.h>
int main()
{
int x=9,y=5,z=4;
printf("%d\n",!2-1||2<x&&3!=y);
printf("%d\n",(x+y)&&!z-4&&4%z);
return 0;
}
运行结果:
1
0
5.7 条件运算
5.7.1 条件运算符
条件运算符是C语言中唯一的三目运算符,它需要3个运算数或表达式构成条件表达式。它的一般形式为:表达式1?表达式2:表达式3
执行顺序是:先求解表达式1,如果成立则整个条件表达式的值就是表达式2的值;否则整个表达式的值就是表达式3的值。例如,表达式“max=((a>b)?a:b)”,先判断a>b是否成立,成立的话表达式(a>b)?a:b的值就是a,不成立的话表达式的值就是b。执行结果就是最后将条件表达式的值赋给max,也就是将a和b中的较大值赋给max。
条件表达式的结合方向是从右向左。如:a>b?a:c>d?c:d等价于 a>b?a:( c>d?c:d)
5.7.2 编程验证
求3个数中的最大数。代码如下:
#include <stdio.h>
int main()
{
int x,y,z,max;
scanf("%d%d%d",&x,&y,&z);
max=x>(y>z?y:z)?x:(y>z?y:z);
printf("%d,%d,%d,max=%d\n",x,y,z,max);
return 0;
}
运行结果:
1 5 3↙
1,5,3,max=5