您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计基础 第四讲
C语言程序设计基础第四讲运算及表达式求值中南大学信息科学与工称学院计算机科学系张伟基本内容•C基本运算符简介•C特殊运算介绍•多目运算及其优先级分类•运算的结合性质•复杂表达式求值•表达式求值过程中的数据类型装换C基本运算符简介序号种类内容功用1算术运算符+※-※*※/※%※++※--数值计算2关系运算符※=※※=※=※==※!=比较运算3逻辑运算符&&※||※!逻辑运算4位运算符&※|※~※^※※字节位操作5赋值运算符=一般赋值+=※-=※/=※*=※%=算数复合赋值&=※|=※~=※^=※=※=位运算复合赋值6条件运算符(条件)?(表达式一):(表达式二)按条件选择计算7逗号运算符表达式1,表达式2,。。。,表达式n或者(,)多表达式求值8指针运算符&※*取地址/内容9强制类型转换(数据类型)(表达式或变量)数据类型转换10成员运算符-※.取成员运算11求字节运算符Sizeof(变量)计算变量字节数12其它[]※()下标/改优先级基础赋值运算=※一个二元运算符,其左操作数只能为变量,而右操作数可以为常量、变量或表达式,即:变量=表达式※在赋值过程中,首先对等号右边的表达式求值,再将求值结果赋予=左边的变量※赋值表达式可以出现在其他表达式中:(a=1)+(b=2)*8-(c=4)※赋值表达式右侧也可以是一个赋值表达式:a=(b=0)※算术运算符的优先级高于赋值运算符,结合顺序是“从右至左”。例如:a=b=c=d=1,a=8+(b=2),a=(b=5)+(c=7),a=b=1+(c=3)C特殊运算介绍--%求余※模运算符%是一个二元运算符。※优先级和结合方向同*和/。※%要求两侧的操作数均为整型数据。且n%m的结果为n/m的余数部分,即n被m除的余数。※余数的符号与被除数一致。如:9%4的结果为1,6%3的结果为0,4%5的结果为4,-4%5=?4%-5=?-4%-5=?C特殊运算介绍—自加/自减运算※++和--使参加运算对象的值增1或减1※单目运算符,运算对象可以是整型或实型变量,不能是常量或表达式,如:++a,--a※其构成形式有如下四种:前缀(++a、--a),后缀(a++、a--),运算后a的值相同,表达式的值不同。#includestdio.hMain(){intI=0;printf(“%d”,i++);printf(“%d”,i);printf(“%d”,++i);printf(“%d”,i);}C特殊运算介绍—自加/自减运算main(){inta=1,b=1;printf(“++a=%d,b++=%d\n”,++a,b++);printf(“a=%d,b=%d\n”,a,b);printf(“--a=%d,b--=%d\n”,--a,b--);printf(“a=%d,b=%d\n”,a,b);}C特殊运算介绍—位运算&:双目运算符,参与运算的两数各对应的二进位相与,常用来对某些位清0或保留某些位。9&5=1|:双目运算符,参与运算的两数各对应的二进位相或,9|5=13^:双目运算符,参与运算的两数各对应的二进位相异或,相异时结果取1。9^5=12~:单目运算,对操作数的各二进位按位求反。~9=1111111111110110。:双目运算,其功能把“”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。A2(如果不考虑溢出,相当于乘2):双目运算符。其功能是把“”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。A2(相当于除以2)。注:正数右移最高位补0,负数的符号位将一起移动,补0还是1由编译系统决定※位运算用途最多的场合多是在控制系统中,通过移位运算形成对应将设备的控制字或者用于获取特定位从而判定系统的状态。C特殊运算介绍—关系/逻辑运算•关系运算都是双目运算,优先级低于算数运算,用于判定两个表达式之间的关系。其最终运算结果为布尔类型:trueorfalse。•逻辑运算中&&和||为双目运算,优先级低于关系运算,!为单目运算;!的优先级高于算数运算。逻辑运算的结果为布尔类型:trueorfalse。•无论是关系运算还是逻辑运算,多用于构造条件表达式,出现在分之程序结构中,控制程序的执行方向。例:ab&&cd等价于(ab)&&(cd)!b==c||da等价于((!b)==c)||(da)a+bc&&x+yb等价于((a+b)c)&&((x+y)b)C特殊运算介绍—复合赋值运算※在赋值符“=”之前加上其它二目运算符可构成复合赋值运算。其它运算符包括算数运算符(不包括++、--)、位运算符。其一般形式为:变量双目运算符=表达式。如:x+=6等价于x=x+6y*=5+x等价于y=y*(5+x)※符合赋值运算符的优点在于可以增加编译效率C特殊运算介绍—条件运算符•条件运算符由?和:组成,它是一个三目运算符,其形式为:表达式1?表达式2:表达式3。•求解规则:首先求解表达式1,如果为true,则求解表达式2,整个表达式的值即为表达式2的值,否则求解表达式3,整个表达式的值即为表达式3的值。•条件运算符用于实现程序的分支结构,即非此即彼的关系•条件运算符是?:的组合,不能分开单独使用•注意:?:的优先级仅比赋值运算符和逗号运算符高,故在和其它运算符混合使用时应在其两边加上括号#includestdio.hMain(){intx,y,max;scanf(“%d\n%d\n”,&x,&y);max=xy?x,y;printf(“%d\n”,max);}C特殊运算介绍—逗号运算※逗号表达式的构成形式如下:表达式1,表达式2,……,表达式n。将多个表达式连接起来构成逗号表达式。※逗号表达式的求解过程是:先求解表达式1,再求解表达式2,最后求解表达式n,且表达式n的值就是该逗号表达式的值。※逗号表达式的结合顺序:自左向右。※逗号运算符的优先级在所有运算符中是最低的。例:a=(3+5,3*5,5/3)a=3+5,3*5,5/3(i=3,i++,++i,i+5)多目运算及其优先级分类一※任何一个表达式都是由运算符及相关的运算数(操作数)组成。一个运算符在实现计算过程中所需要的操作数个数,成为该运算符的目数。如基本的算术运算符都属于二目运算,条件运算符属于三目运算。而逗号运算属于多目运算。※在C中,最为常见的是一到三目运算,一种运算符其目数越少,则其运算优先级越高。即单目运算的优先级高于二目运算,二目运算高于三目运算,以此类推。。。。※C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式求值的时候,优先级高的运算进行结合所需的操作数不能被优先级低的计算所拆分。运算的结合性质※在C语言表达式求值过程中,优先级高的运算优先执行.而在优先级相同的情况下,运算符的结合性质决定了同级运算执行的先后顺序.C运算符的结合性分为左结合和右结合两种.※所谓的左结合即先左后右或从左向右的方向进行计算.如x-y+z在求值过程中,先计算x-y,再计算+z.即+、-运算具有左结合性;※所谓的右结合即先右后左或者从右相左的方向进行计算.如x=y=z的执行顺序为x=(y=z),即=运算具有右结合性。多目运算及其优先级分类/结合性质表1优先级运算符含义方式结合性目1[]数组下标数组名[表达式]左()改优先级/函数调用(表达式)/函数(参数).对象成员选择对象名.成员-指针成员选择指针名-成员2-负号运算-表达式右单(类型)强制类型转化(数据类型)表达式++自加++变量/变量++--自减--变量/变量--*取值*指针变量&取地址&变量!逻辑非!表达式~按位取反~表达式Sizeof长度运算Sizeof(表达式)多目运算及其优先级分类/结合性质表2优先级运算符含义方式结合性目3/除表达式/表达式左双*乘表达式*表达式%模整型表达式%整型表达式4+加表达式+表达式左双-减表达式-表达式5左移变量表达式左双右移变量表达式6大于表达式表达式左双=大于等于表达式=表达式小于表达式表达式=小于等于表达式=表达式7==等于表达式==表达式左双!=不等于表达式!=表达式8&按位与表达式&表达式左双多目运算及其优先级分类/结合性质表3优先级运算符含义方式结合性目9^异或表达式^表达式左双10|按位或表达式|表达式左双11&&逻辑与表达式&&表达式左双12||逻辑或表达式表达式左双13?:条件运算表达式1?表达式2:表达式右三14+=加后赋值变量+=表达式右-=减后赋值变量-=表达式/=除后赋值变量/=表达式*=乘后赋值变量*=表达式%=模后赋值变量%=表达式=左移位后赋值变量=表达式=右移位后赋值变量=表达式|=位或后赋值变量|=表达式&=位与后赋值变量&=表达式^=位异或后赋值变量^=表达式=赋值运算变量=表达式15,逗号运算表达式,表达式,……,表达式左复杂表达式求值方法※按照优先级从高到低的顺序执行计算过程※同优先级的计算按照运算符结合属性决定计算方向,进而决定运算执行的先后顺序(为了避免混乱,C规定同优先级的运算符结合方向是一致的)※在表达式求值过程中,按照优先级原则进行分层计算,在同优先级中,结合方向决定了计算的先后顺序.※++、--属于有“副作用”的运算,计算过程中要特别注意※如果一定要构造复杂的表达式,要善于使用括号明晰运算优先级及求解的层次关系复杂表达式求值方法—例1#includestdio.hmain(){inti=5,j=5,p,q;p=i+++i+++i++;printf(“%d%d\n”,p,i);//q=++j+++j+++j;//printf(“%d%d\n”,q,j);}值++i++i++i++复杂表达式求值方法—例2#includestdio.hMain(){intI=3;printf(“%d\n”,i++*++i+i--*--i);printf(“%d”,i);}+**i++++ii----i值复杂表达式求值方法—警告※C的表达式功能强大且垃圾,没有把握不要构造过于复杂的表达式;※任何复杂的表达式都可经过拆分后变成若干简单表达式的等效组合※不同的C编译系统,对求值规则的解释可能会有所差别,因此同样的表达式在不同的系统下可能会得到不同的值表达式求值过程中的类型转换—自动※当运算符两边的操作数类型不同时,其中一个操作数就要经过类型转换以和另一个操作数的类型相一致,然后才能进行运算。※变换操作数采取就高不就低的原则。即级别低的操作数先被转换成和级别高的操作数具有同一类型,然后再进行运算,结果的数据类型和级别高的操作数相同。各种类型级别的高低如下所示:高doublefloatlongunsigend低intchar,short–例如:10+‘x’+7*2.0-7/5※强制类型转换表达式:(类型)表达式)–例如:(int)(1.7+5.6)=?,(int)3.2+5.8=?表达式求值过程中的类型转换•类型转换也发生在赋值运算符的两边,且不管赋值运算符右边表达式的结果类型为何,一律转换为左边变量的类型,然后再赋给左边的变量。•类型的提升:是将较低级的类型转换为较高级的类型,通过增加一些二进制位来完成,精度没有损失。•类型的下降:是将较高级的类型转换为较低级的类型,要截断和舍入二进制位,通常会引起精度的损失表达式求值过程中的类型转换—赋值/强制•(1)浮点型与整型●将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。(2)单、双精度浮点型●由于C语言中的浮点值总是用双精度表示的,所以float型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。(3)char型与int型●int型数值赋给char型
本文标题:C语言程序设计基础 第四讲
链接地址:https://www.777doc.com/doc-3524732 .html