讲解视频:
P2-3.【基本数据类型、运算符和表达式】第三节
P2-4.【基本数据类型、运算符和表达式】第四节
目录
必备知识与理论
任务实施
必备知识与理论
C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的主要特点之一。
本任务只介绍最常用的算术运算符、赋值运算符、关系运算符、逻辑运算符、逗号运算符及其相应的表达式。其它运算符将在后续任务中介绍。
1.算术运算符与算术表达式
(1)算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除 (/)、求余(%,或称模运算)、自增(++)、自减(--)共7种。
双目运算符是有两个运算量参与运算的运算符。如a+b,4 -8,c/5等都是有两个量参加运算。
双目运算符中的加(+)、减(-)、乘(*)运算与普通的算术运算中的加法、减法、乘法相同,具有左结合性,这里不在再解释。使用算术运算符应注意以下几点:
“+”、“-”也可分别作正值、负值运算符,此时为单目运算,具有右结合性, 如+X,-5等。
除法运算符“/”是双目运算,具有左结合性。当参与运算量均为整型时,结果也为整型,舍去小数,如5/2的值为2,而不是2.5;如果运算量中有一个是实型,则结果为双精度实型,如5.0/2的值为2.5。
求余运算符(模运算符)“%”是双目运算,具有左结合性。要求参与运算的量必须为整型。求余运算的结果等于两数相除后的余数,一般情况下,所得余数与被除数符号相同。如5%2=1,10%5=0,8%-5=3。
自增运算符(++)的功能是使变量的值自增1,自减运算符 (--)的功能是使变量值自减1。它们均为单目运算,都具有右结合性。自增、自减运算符只能用于变量,而不能用于常量或表达式,如6++或(a+b)++都是不合法的。自增、自减运算符可有以下几种形式。
++i /* i值自增1后再参与其他运算 */
--i /* i值自减1后再参与其他运算 */
i++ /* i参与运算后再将值自增1 * /
i-- /* i参与运算后再将值自减1 * /
对于一个变量i实行前置运算(++i)和后置运算(i++),其运算结果是一样的,即都使变量i的值加1(i=i+1)。但++i和i++的不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。
例如,假设i的初值为3,则:
j=++i; /* i的值先变成4再赋给j,j的值为4 */
j=i++; /* 先将i的值赋给j,j的值为3,然后i变为4 */
(2)算术表达式
用算术运算符和圆括弧将操作数(即常量、变量和函数)组合起来的符合C语言语法规则的式子,称为C算术表达式。
C表达式不允许使用方括号和花括号,只能使用圆括号帮助限定运算顺序。可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。
2.赋值运算符与赋值术表达式
赋值运算符用于赋值运算,分为简单赋值(=)、复合算术运算赋值 (+=,-=, *=,/=,%=)和复合位运算赋值(&=,|=,^ =, >>=, <<= ) 共3 类。
(1)简单赋值运算
简单赋值的一般格式为:
变量名=表达式
含义是将赋值运算符右边表达式的值存放到以左边变量名为标识的存储单元中。
例如:语句i=3中的赋值运算符“=”的功能是将整型常量3赋给整型变量i,这样i的值就是3。
(2)复合赋值运算符
C语言规定可以在赋值运算符“=”之前加上其它运算符,以构成复合赋值运算符。其一般格式为:
变量 双目运算符=表达式;
等价于:
变量=变量 双目运算符 表达式;
例如:
n+=1; /* 等价于n=n+1 */
x*=y+1;/* 等价于x=x*(y+1) */
C语言规定,所有双目运算符都可以与赋值运算符一起组合成复合赋值运算符。共有10种复合赋值运算符,即+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。 其中后5种是有关位运算的,将在后面介绍。复合赋值运算符的优先级与赋值运算符的优先级相同,且结合方向也一致。
(3)赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。一般格式为:
变量=表达式
赋值表达式的求解过程如下:
①先求解赋值运算符右侧“表达式”的值。
②将赋值运算符右侧“表达式”的值赋给左侧的变量。
③赋值表达式的值就是被赋值变量的值。
(4)变量赋初值
在程序中常常需要对一些变量赋初值,以便使用变量。C语言允许在定义变量的同时为其赋初值。
int a=1;
等价于:
int a;
a=1;
3.逗号运算符与逗号表达式
C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个或多个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:
表达式1,表达式2,…,表达式n
求值过程为:先求出表达式1的值,再求出表达式2的值,……,依次求出各个表达式的值,并以表达式n的值作为整个逗号表达式的值。
逗号运算符是所有运算符中级别最低的,且具有从左至右的结合性。
例如:a=3*4,a*5,a+10;
求解过程为:先计算3*4,将12赋给a,然后计算a*5,值为60,最后计算a+10,值为12+10=22,所以整个表达式的值为22,变量a的值为12。
4.关系运算符和关系表达式
(1) 关系运算符
关系运算符用于比较运算。包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)6种。
关系运算符都是双目运算符,其结合性均为左结合。在6个关系运算符中,前面四个的优先级相同(>,<,>=,<=),后两种(==,!=)的优先级相同,并且前面4种的优先级高于后面两种。
用关系运算符比较的数据有:整型、实型和字符型,字符串则不能用关系运算符做比较。比较整型或实型数据时,按照数值大小进行比较;比较字符型数据时,按照字符的ASCII值进行比较。
关系运算符的优先级低于算术运算符,高于赋值运算符。
(2)关系表达式
用关系运算符将两个比较的对象连接起来的式子称为关系表达式,其格式为:
表达式 关系运算符 表达式
5. 逻辑运算符和逻辑表达式
(1)逻辑运算符
逻辑运算符用于逻辑运算。包括与(&&)、或(||)、非(!)3种运算符。与 (&&)和或(||)运算符均为双目运算符,具有左结合性。非(!)运算符为单目运算符,具有右结合性。
(2)逻辑表达式
用逻辑运算符将运算对象连接起来的有意义的式子称为逻辑表达式,其格式:
表达式 逻辑运算符 表达式
若逻辑表达式成立为真(即true)则返回1;否则,表达式为假(即false)返回0。
6. 运算符的优先级与结合性
C语言规定了运算符的“优先级”和“结合性”。在表达式求解时,先按运算符的“优先级别”高低次序执行。
例如:a-b*c等价于a-(b*c),运算符“*”的优先级高于运算符“-”。
如果在一个运算对象两侧的运算符优先级别相同,则按规定的“结合方向”处理。左结合性(自左向右结合方向)是指运算对象先与左边的运算符结合,右结合性(自右向左结合方向)是指运算对象先与右边的运算符结合。
例如:a-b+c等价于(a-b)+c。
在书写有多个运算符的表达式时,应注意各个运算符的优先级,确保表达式中的运算符能以正确的顺序参与运算。对于复杂的表达式,为了清晰起见可加圆括号“()”强制规定运算顺序。
任务实施
现在来完成本任务:计算数学表达式的值。
(1)先将数学表达式
转换成C语言表达式为:x=(-b+5*a*a)/(2*a)。
(2)确定变量a、b和x的数据类型。为便于计算,将a、b定义为整型,x定义为实型。
(3)由于a、b为整型,根据C语言的运算规则,两个整数相除的结果为整型数据,而x定义为实型数据,为了得到正确的结果,可进行强制类型转换。
程序代码如下:
#include <stdio.h>
main()
{ int a,b;
float x;
scanf("%d%d",&a,&b); /* 通过键盘给a,b赋值,&a表示变量a的地址 */
x=(float)(-b+5*a*a)/(2*a); /* 将右边整型数据转换为实型 */
printf("x=%f\n", x);
}
程序运行结果:
2 3↙
x=4.250000