您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > c语言程序设计与项目实践第3章
第3章运算符和表达式本章的学习重点◆运算符与表达式的分类◆算术运算符与算术表达式◆逻辑运算符与逻辑表达式◆关系运算符与关系表达式◆位运算符◆条件运算符◆强制类型转换3.1运算符与表达式的分类运算符的分类:可按照操作对象数目分类,例如一元运算符、二元运算符和三元运算符等,也可按照功能分类,例如算术运算符、逻辑运算符、关系运算符等。表达式的分类:主要按照运算符的不同功能进行分类,例如算术表达式、逻辑表达式、关系表达式等。3.1.1运算符的分类按照操作对象的多少,运算符主要可分为一元运算符、二元运算符和三元运算符。例如负号(-)为一元运算符,加号(+)为二元运算符等。除了这些基本运算符之外,C语言还支持复合运算符以及sizeof运算符等。按照功能分类,运算符可分为:算术运算符、赋值运算符、逻辑运算符、关系运算符、条件运算符、位运算符、取字节数运算符等。3.1.1运算符的分类表3-1运算符分类一元运算符二元运算符三元运算符符号功能描述符号功能描述符号功能描述+-正负号-减号?:条件运算符++自增运算符+加号--自减运算符*乘号!非运算符/除号~取反运算符%求余运算符*指针运算符左移运算符右移运算符&&与运算符||或运算符^异或运算符大于号小于号=大于等于=小于等于!=不等于==等于=赋值运算符&位与运算符|位或运算符3.1.2表达式的分类表达式是一种有值的语法结构,它一般由运算符将变量、常量或函数返回值结合而成。表达式按照运算符的不同进行分类,主要有:算术表达式、逻辑表达式和关系表达式等。1.算术表达式一般由算术运算符和控制运算优先级的括号连接而成,例如:3.14159*r,(a+b)/c+d*m.其中,符号’*’表示算术运算“乘”,’/’表示算术运算“除”。2.赋值表达式一般由赋值运算符、算术运算符和操作对象组合而成。一般表达形式为:变量=表达式或数值或者变量1=变量2=变量3=表达式或数值。3.1.2表达式的分类3.逻辑表达式一般由逻辑运算符和操作对象组合而成,例如:a&&b,c||d&&m,!x等。4.关系表达式一般由关系运算符和操作对象组合而成,例如:ab,c=d,m==n等。5.逗号表达式逗号表达式由其他表达式和逗号运算符组成,例如:a=12,b=100,c=a+b6.复合表达式复合表达式是几种简单表达式的组合,是比较复杂的表达式,例如:num=12+b+(c=35/(d=7))3.2运算符的优先级与结合性当不同的运算符放在一个表达式中进行混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。在同一表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性决定的。所谓结合性是指运算符可以和左边的表达式结合,也可以和右边的表达式结合。3.2运算符的优先级与结合性表3-2运算符优先级与结合性优先级运算符解释结合方式最高()[]-.括号(函数等),数组,两种结构成员访问由左向右!~++--+-非,按位取反,自增,自减,正负号由右向左*&(类型)sizeof解引用(指针),取地址,类型转换,字节大小*/%乘,除,模除由左向右+-加,减由左向右左移,右移由左向右==小于,小于等于,大于等于,大于由左向右==!=等于,不等于由左向右&按位与由左向右^按位异或由左向右|按位或由左向右&&逻辑与由左向右||逻辑或由左向右?:条件由右向左=+=-=*=/=赋值由右向左&=^=|===最低,逗号(顺序)由左向右3.2运算符的优先级与结合性范例3.1PriorityAndCombine.c这里使用多运算符的表达式演示不同优先级的运算符组合运算所产生的结果。程序定义变量a,b,c,并使用复合赋值运算符+=验证复合赋值运算符的功能。分析:查看代码:由于赋值是自右至左的右结合性,因此先计算赋值号右边的表达式a+c*10,结果为210,然后将结果赋给b。3.3赋值运算符与赋值表达式C语言规定,任何变量都要先定义后使用,并且在引用其数值前一定要进行赋值操作,而此时就需要用到赋值运算符“=”。1.简单赋值表达式赋值表达式使用赋值号表示,赋值号左边的对象叫做左值(l-value),赋值号左边只能是变量。a+=5等价于a=a+5若a=20,执行后a+=5后,a的值变为253.3赋值运算符与赋值表达式范例3.2(LvalueAndRvalue.c)将int型变量的值赋给short型变量,查看赋值后的结果。为表述方便,程序使用十六进制值0x12345,接收变量为short型。2.连续赋值表达式有时需要对几个变量赋予同一个值,这时可以使用连续赋值表达式,例如:inti,j,k;i=j=k=10;由于赋值运算符是右结合性,因此程序执行顺序为:k=10j=ki=j3.3赋值运算符与赋值表达式3.复合赋值表达式复合赋值表达式由赋值运算符、算术运算符或逻辑运算符以及操作对象构成。例如,表达式a+=10,它等价于:a=a+10。范例3.3(DAssignmentOperator.c)使用复合赋值运算符进行算术和赋值操作。程序使用*=和+=分别对变量m和n作赋值运算,验证在同一表达式中两者之间的关系。注意:在工程应用中,应尽量避免使用这些简化的复合赋值运算符,原因有两点:一是编码时容易出错,二是不便于其他程序员阅读。3.4算术运算符与算术表达式C语言除了提供简单的加减乘除四则运算符外,还提供了模除(%)、自增(++)和自减(--)等几种特殊的算术运算符。模除运算符(%)用于求两个整数相除的余数。自增(++)自减(--)运算符是C语言所特有的运算符,在工程中应用非常频繁。只能用于单个变量。3.4.1算术运算符与数据类型C语言中,除运算符用’/’代替,乘运算符用’*’代替,并且’*’不能省略(如x*y不能省略为xy)。范例3.4(ComputeOperatorType.c)程序使用输出函数printf验证两种不同数据类型进行算术除操作的结果,分析浮点型数据作算术运算的精度。C语言中,两个整型量作算术运算,其结果仍为整型,例如,算式:1/2的值取商中的整数部分0。注意:0不能作为除数,否则程序运行时将崩溃。3.4.1算术运算符与数据类型实训3.1——计算圆柱体体积有一长为50cm,宽为30cm的长方形纸张,编写程序,计算将该纸张卷成圆筒时的体积,要求精确到小数点后6位,圆周率取3.141592。纸张卷成圆筒的方法有两种,一种是以长50cm作高,宽30cm作底,另一种是以宽30cm作高,长50cm作底。这里使用第二种方案。使用周长50cm计算半径r,实现语句:r=50.0/(2*pi);根据数学公式:V=S*H,计算体积V=pi*r*r*h,其中h=30。采用数据类型double型以满足精度要求。3.4.2模除运算符模除运算符(%):用于求两个整数相除的余数。模除运算只能用于整数间求余运算,不可用于浮点数。并且0不能作为除数。例如:7%3结果为1,而7.5%5将使程序编译出错。C语言规定,%两边都为正整数,结果为正整数或零;%两边都是负整数,结果为负整数数或零。%左边的操作数是正整数,结果为正整数或零;%左边的操作数是负整数,结果为负整数或零,例如:17%4=117%-4=1-17%4=-1-17%-4=-13.4.2模除运算符范例3.4(Months2Year.c)键盘输入总月数,使用%运算符和/运算符将输入的月数换算成年数和月数的形式,如25个月,表示2年零1个月。模除运算,例如m%n,可以使用公式m–(m/n)*n代替,例如算式中-17%4,可以使用算式:-17%4=-17–(-17/4)*4=-1注意:/和%的区别,5/3=1,5%3=23.4.3自增自减运算符自增(++)自减(--)运算符:只能用于变量,不能用于表达式或其他C语言对象。下面的操作均错误:(b+c)++;--(m-1);范例3.5SelfAddSelfReduce.c程序定义4个变量a,b,c,d。对部分变量执行自增自减操作,验证左运算和右运算的区别,并进一步分析自增自减运算符与算术运算符的优先级。范例3.5SelfAddSelfReduce2.c定义变量a,分别执行单次和多次自增运算,输出结果,分析同一表达式中两次和三次自增操作中左运算和右运算的差别。3.5关系运算符与关系表达式关系表达式的值:真(1)和假(0)。例如:表达式103的值为1,即为真,而表达式-10的值为0,即为假。范例3.6RelationOperater.c程序分析关系运算符的优先级,验证在同一表达式中有算术运算符和关系运算符时程序执行顺序,分析关系运算符的结合性,分析关系表达式的真和假。注意:判断两个对象是否相等,使用运算符==或!=,一定与赋值运算符=区分开来。3.6逻辑运算符与逻辑表达式C语言中提供了三种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。前两种为双目运算符,具有左结合性。后一种为单目运算符,具有右结合性。逻辑表达式的值:“真(1)”和“假(0)”两种。逻辑表达式中总是将0作为假,非0作为真。逻辑表达式的一般形式为:操作对象1逻辑运算符操作对象23.6.1逻辑与(&&)逻辑与运算(&&):参与运算的两个操作对象都为真(非0)时,结果为真(1),否则为假(0)。例如,表达式-410&&3!=0的结果为真。具有自左至右的结合性,当运算符左边为假时,表达式为假,而不再判断运算符右边是否为真或假。例如,表达式02&&3!=5,由于表达式02为假,因此便不再判断表达式3!=5,而直接认为原表达式为假(0)。范例3.7LogicAndOperater.c程序分析逻辑与运算符的优先级与结合性,并分析逻辑与表达式执行过程中对两侧表达式执行顺序的影响。3.6.2逻辑或(||)逻辑或运算(||):参与运算的两个操作对象只要有一个为真(非0),结果即为真(1),否则为假(0)。例如,表达式-410||3==0,表达式中||优先级低于关系运算符和==,所以表达式等价于(-410)||(3==0),表达式-410为真,因此原表达式的结果为真。C语言规定,当运算符左边为真(非0)时,即判断表达式为真(1),而不再判断运算符右边是否为真或假。例如,表达式2||3!=5,由于常量2为真(非0),因此便不再判断表达式3!=5,而直接认为原表达式为真(1)。范例3.8LogicOrOperater.c程序分别设置逻辑与表达式和逻辑或表达式。在范例3.7基础上进一步分析逻辑与表达式的执行顺序,分析逻辑或的执行顺序,并与逻辑与表达式进行比较。分析产生的结果。3.6.3逻辑非(!)逻辑非运算(!):一元运算符,该运算符只能放在操作对象左边。当操作对象为真(非0)时,结果为假(0),操作对象为假(0)时,结果为真。范例3.9LogicNoneOperator.c程序分析逻辑非表达式的真和假,验证当变量a为非0时,!a的含义,并分析复合逻辑运算时表达式的执行顺序与结果。实训3.2——判断闰年CalculateLeapYear.c年数中分为平年或闰年,编写程序,判断输入年数是闰年还是平年,闰年输出为1,平年输出为0。闰年判断公式:((year%4==0)&&(year%100!=0))||(year%400==0)。需求分析:需求1:输入年数需求2:使用逻辑运算符判断输入的年数是否为闰年3.7位运算符位运算:对操作对象中的比特位(bit)进行移位、重置以及逻辑判断等操作。位运算只能用于字符型(char)或整型(int,short,long等),不能用于float、double、void或其他复杂类表3-4位运算符运算符意义表达式运算功能~按位取反~aa按位取反按位左移b2b左移2位按位右移c3
本文标题:c语言程序设计与项目实践第3章
链接地址:https://www.777doc.com/doc-752163 .html