c语言程序设计与项目实践第章_第1页
c语言程序设计与项目实践第章_第2页
c语言程序设计与项目实践第章_第3页
c语言程序设计与项目实践第章_第4页
c语言程序设计与项目实践第章_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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.关系表达式一般由关系运算符和操作对象组合而成,例如:a>b,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注意:/和%%的区别,55/3=1,,5%3=223.4.3自自增自减减运算符自增(++))自减(--)运算符::只能用于变量量,不能用于于表达式或其其他C语言对对象。下面的的操作均错误误:(b+c)++;--(m-1);范例3.5SelfAddSelfReduce.c程序序定义4个变量量a,b,c,,d。对对部分变变量执行行自增自自减操作作,验证证左运算算和右运运算的区区别,并并进一步步分析自自增自减减运算符符与算术术运算符符的优先先级。范例3.5SelfAddSelfReduce2.c定定义变量量a,分分别执行行单次和和多次自自增运算算,输出出结果,,分析同同一表达达式中两两次和三三次自增增操作中中左运算算和右运运算的差差别。3.5关关系系运算符符与关系系表达式式关系表达达式的值值:真((1)和和假(0)。例如:表表达式10>3的值为为1,即即为真,,而表达达式-1>0的的值为0,即为为假。范例3.6RelationOperater.c程程序分分析关系系运算符符的优先先级,验验证在同同一表达达式中有有算术运运算符和和关系运运算符时时程序执执行顺序序,分析析关系运运算符的的结合性性,分析析关系表表达式的的真和假假。注意:判判断两个个对象是是否相等等,使用用运算符符==或或!=,,一定与与赋值运运算符=区分开开来。3.6逻逻辑辑运算算符与与逻辑辑表达达式C语言言中提提供了了三种种逻辑辑运算算符::逻辑与与(&&))、逻逻辑或或(||))和逻逻辑非非(!)。。前两种种为双双目运运算符符,具具有左左结合合性。。后一一种为为单目目运算算符,,具有有右结结合性性。逻辑表表达式式的值值:““真((1))”和和“假假(0)””两种种。逻逻辑表表达式式中总总是将将0作作为假假,非非0作作为真真。逻辑表表达式式的一一般形形式为为:操作对对象1逻逻辑运运算符符操操作对对象23.6.1逻逻辑辑与((&&)逻辑与与运算算(&&)):参与运运算的的两个个操作作对象象都为为真((非0)时时,结结果为为真((1)),否否则为为假((0))。例例如,,表达达式-4<10&&3!=00的结结果为为真。。具有自自左至至右的的结合合性,,当运运算符符左边边为假假时,,表达达式为为假,,而不不再判判断运运算符符右边边是否否为真真或假假。例例如,,表达达式0>2&&3!=5,由由于表表达式式0>2为为假,,因此此便不不再判判断表表达式式3!=5,而而直接接认为为原表表达式式为假假(0)。。范例3.7LogicAndOperater.c程程序序分析析逻辑辑与运运算符符的优优先级级与结结合性性,并并分析析逻辑辑与表表达式式执行行过程程中对对两侧侧表达达式执执行顺顺序的的影响响。3.6.2逻逻辑辑或((||)逻辑或或运算算(||)):参与运运算的的两个个操作作对象象只要要有一一个为为真((非0),,结果果即为为真((1)),否否则为为假((0))。例例如,,表达达式-4<10||3==0,表表达式式中||优优先级级低于于关系系运算算符<和==,,所以以表达达式等等价于于(-4<10)||((3==0),,表达达式-4<10为真真,因因此原原表达达式的的结果果为真真。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按位取反<<按位左移b<<2b左移2位>>按位右移c>>3c右移3位&按位与a&ba和b按位与^按位异或a^ba和b按位异或|按位或a|ba和b按位或3.7位位运算符1.按位与((&)规则:每个操操作对象对应应位都为1时时,结果才为为1,否则为为0。例如::3&5的计计算方法为::先转化为二二进制,然后后按位进行与与操作。00000011& 00000101-------------结结果为100000001应用:按位与(&))主要用于将将某个操作对对象的某些位位置零,例如如,将int型变量a的的第3、5、、7、12位位置零,方法法为将a和二二进制数1110111101011111作位与与操作,表达达式为:a&0xEF5F。3.7位位运算符范例3.10LogicBitAnd.c使用位&操作作取变量a的的低10bit位,其余余位置零,并并使用十六进进制打印结果果。方法为使使变量a与另另一常量作&,该常量低低10位为1,其余位为为0。2.按位或((|)规则:有一个个操作对象对对应位为1时时,结果即为为1,当两个个操作对象对对应位都为为为0时,结果果才为0。例例如:3|5的计算方法法为:先转化化为二进制,,然后按位进进行或操作。。00000011| 00000101------------- 结果果为7000001113.7位位运运算算符符3..按按位位异异或或((^))规则则::操操作作对对象象对对应应位位相相同同时时为为1,,不不同同时时为为0。。例例如如3^5的的计计算算方方法法为为::先先转转化化为为二二进进制制,,然然后后按按位位进进行行异异或或操操作作。。00000011^00000101-------------结结果果为为0xF9,,十十进进制制数数24911111001用途途::按位位异异或或((^))主主要要用用于于将将操操作作对对象象的的的的某某些些位位翻翻转转((原原来来为为1的的位位变变为为0,,为为0的的变变为为1),,其其余余各各位位不不变变。。实训训3.3————交交换换两两变变量量的的值值ExchangeTwoVariable.c编写写程程序序,,不不使使用用其其他他中中间间变变量量,,交交换换两两个个整整型型变变量量a和和b的的值值。。使使用用按按位位异异或或((^))交交换换两两变变量量的的值值。。使使用用异异或或操操作作置置位位两两变变量量对对应应位位不不同同的的位位置置,,并并依依次次交交叉叉操操作作,,达达到到两两值值交交换换的的功功能能,,本本例例主主要要使使用用一一个个变变量量存存储储了了两两个个变变量量信信息息的的特特性性。。需求求分分析析::需求求1::交交换换两两个个变变量量的的值值需求求2::不不使使用用中中间间变变量量实现现::使用用按按位位异异或或((^))运运算算符符,,完完成成操操作作,,方方法法为为::首首先先将将变变量量a和和b作作异异或或操操作作,,将将结结果果赋赋给给a,,然然后后将将b与与a作作异异或或操操作作,,并并将将结结果果赋赋给给b,,重重复复第第一一步步操操作作,,完完成成。。3.7位位运运算算符符4..按按位位取取反反((~))按位位取取反反操操作作是是将将操操作作对对象象各各位位翻翻转转,,即即原原来来为为1的的位位变变成成0,,原原来来为为0的的位位变变成成1。。例例如如::1111111100010011~---------------------------0000000011101100用途途::按位位取取反反操操作作主主要要用用于于间间接接地地构构造造一一个个数数,,以以增增强强程程序序的的可可移移植植性性。。3.7位位运运算算符符5..按按位位左左移移((<<))操作作::使使操操作作对对象象的的各各位位左左移移,,低低位位补补0,,高高位位溢溢出出。。其其中中,,操操作作对对象象和和左左移移位位数数只只能能是是整整型型或或字字符符型型。。6..按按位位右右移移((>>))操作作使使操操作作对对象象的的各各位位右右移移,,高高位位补补0,,低低位位舍舍弃弃。。与与左左移移类类似似,,操操作作对对象象和和右右移移位位数数只只能能是是整整型型或或字字符符型型。。3.8条条件件运运算算符符条件件运运算算符符::C语语言言中中唯唯一一一一个个三三元元运运算算符符((三三目目运运算算符符)),,其其一一般般表表达达形形式式为为::(表表达达式式1))??表表达达式式2::表表达达式式3规则则::若若表表达达式式1的的值值为为真真((非非0)),,则则表表达达式式的的值值为为表表达达式式2,,否否则则为为表表达达式式3。。例例如如::(a>b))??a+b::a-b当a=10,,b=5,,c=2时时,,该该表表达达式式的的执执行行过过程程如如下下::首先先计计算算表表达达式式a>b是是否否为为真真,,经经运运算算为为真真,,因因此此,,表表达达式式的的值值为为a+b,,即即为为15。。实训训3.4————分分段段函函数数计计算算MulitPartFunction.c键盘盘输输入入变变量量x的的值值,,使使用用条条件件运运算算符符判判断断函函数数y的的值值,,并并输输出出x和和y的的值值。。编编写写程程序序,,实实现现分分段段函函数数::需求求分分析析::需求求1::键键盘盘输输入入变变量量x的的值值需求求2::使使用用条条件件运运算算符符判判断断变变量量x的的值值,,并并确确定定y的的值值思路路::判断断键键盘盘输输入入的的变变量量x的的值值,,若若x<-10,,则则y的的值值为为-10,,若若-10<x<10,,则则y的的值值即即为为x的的值值,,若若x>10,,则则y的的值值为为10。。3.9sizeof运运算算符符sizeof运运算算符符::又称称为为取取内内存存字字节节运运算算符符,,C语语言言最最特特殊殊的的运运算算符符之之一一,,用用于于计计算算操操作作对对象象在在内内存存中中所所占占的的字字节节数数。。例例如如::inta=10,b=0;b=sizeof(a);b用用于于存存储储变变量量a在在内内存存中中所所占占字字节节数数,,使使用用sizeof获获取取a的的内内存存字字节节数数。。范例例3.11SizeofUseful.c使使用用sizeof运运算算符符分分别别获获取取charshortintlongfloatdouble等等几几种种基基本本数数据据类类型型的的内内存存字字节节数数,,获获取取实实型型常常量量1.0以以及及字字符符常常量量’’a’’的的内内存存字字节节数数,,获获取取强强制制类类型型转转换换之之后后的的字字符符常常量量’’a’’的的内内存存字字节节数数。。3.10强强制类类型转转换功能::将表达达式的的运算算结果果强制制转换换成类类型说说明符符所表表示的的类型型。其其中,,类型型说明明符必必须使使用括括号括括起来来。例例如::(int)m表示示把m转换换为整整型,,(double)(a*b+c)表表示把把表达达式a*b+c的值值转换换为双双精度度浮点点型。。注意::第一,,类型型说明明符必必须加加括号号;第二,,表达达式应应该加加括号号,若若表达达式仅仅为单单个变变量可可以不不加;;第三,,强制制类型型转换换不改改变被被转换换对象象,仅仅仅为为本次次运算算所需需而进进行的的操作作。3.10强强制类型转转换范例3.11CalcVandS.c计算半径r,高h的的圆柱形桶的的体积V和表表面积S,取取圆周率为为3.14,,要求计算结结果为整型并并输出,体积积V四舍五入入,表面积S仅取整数部部分。9、静夜四无无邻,荒居居旧业贫。。。12月-2212月-22Tuesday,December20,202210、雨中黄叶叶树,灯下下白头人。。。17:50:2117:50:2117:5012/20/20225:50:21PM11、以我独独沈久,,愧君相相见频。。。12月-2217:50:2117:50Dec-2220-Dec-2212、故人江江海别,,几度隔隔山川。。。17:50:2117:50:2117:50Tuesday,December20,202213、乍见翻疑梦梦,相悲各问问年。。12月-2212月-2217:50:2117:50:21December20,202214、他乡生白发发,旧国见青青山。。20十二月月20225:50:21下午17:50:2112月-2215、比不不了得得就不不比,,得不不到的的就不不要。。。。。十二月月225:50下下午午12月月-2217:50December20,202216、行动出出成果,,工作出出财富。。。2022/12/2017:50:2117:50:2120December202217、做前,,能够环环视四周周;做时时,你只只能或者者最好沿沿着以脚脚为起点点的射线线向前。。。5:50:21下午午5:50下午午17:50:2112月-229、没有失败败,只有暂暂时停止成成功!。12月-2212月-22Tuesday,December20,202210、很多事情情努力了未未必有结果果,但是不不努力却什什么改变也也没有。。。17:50:2117:50:2117:5012/20/20225:50:21PM11、成功就是是日复一日日那一点点点小小努力力的积累。。。12月-22

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论