C语言程序设计第03章 表达式与操作符

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3.1表达式3.2关系运算符和关系表达式3.3逻辑运算符和逻辑表达式3.4自增自减操作符3.5赋值和复合赋值操作符3.6条件操作符3.7逗号操作符3.8复合表达式3.9内部类型转换第3章表达式与操作符3.1表达式表达式是数据处理的一种基本形式,它主要由操作数和操作符(也称运算符)构成。C语言表达式的形式多样,功能强大。表达式构造方式:常量、变量、有返回值函数是表达式;表达式经各种操作符连接之后依然是表达式。例如:2//常量表达式a//变量表达式rand()//函数表达式,随机产生一个非负整数a*(b+c)-2//算术表达式c=a=b//赋值表达式。赋值过程是a=b;c=a;rand()%10//混合表达式。产生一个0至9的随机数表达式都有一个值。•赋值操作符左边的表达式称为左值,右边的表达式称为右值。左值应该表示变量。运算符与表达式概述•运算符一般要携带若干运算对象,运算对象称为操作数。根据操作数的个数,运算符可以分为单目运算符、双目运算符和三目运算符。•表达式由运算符和相应的操作数以及用于描述运算先后次序的括号构成。•为了表达式的书写方便(可以少写一些括号),C引进了运算符优先级和结合方向的概念。•运算符的结合方向(结合性)规定了同优先级运算符相遇时候的运算次序。•C运算符有两种结合方向:自左向右结合(左结合性),即运算对象先与左面的运算符结合;自右向左结合(右结合性),即运算对象先与右面的运算符结合常量、变量或函数调用srand(time(0));rand();计算机没有办法产生真正的随机数的,是用算法模拟,所以你只调用rand,每次出来的东西是一样的。设置一个种子后,根据种子的不同,就可以产生不同的数了。而怎么保证种子的不同呢?最简单的办法当然是用永远在向前的时间。就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数,用1970.1.1至今的秒数,初始化随机数种子。示例3.13.2关系运算符和关系表达式①:大于,例如,abx(y+3)②=:大于等于,例如,a=b③:小于,例如,ab④=:小于等于,例如,a=b⑤==:等于,例如,a==b⑥!=:不等于,例如,a!=ba!=0关系表达式是用关系运算符把操作数连接起来的、符合C语法规则的式子。例一、对于关系表达式a!=0当a≠0时,其值为1;当a=0时,其值为0。关系运算符都是双目运算符,用于将两个操作数进行比较,共有以下几种:关系表达式的值只有“真”和“假”两个结果,真用1表示,假用0表示;相应地,关系表达式的类型为int型。关系运算符的优先级在优先级方面,、=、、=的优先级高于==、!=。另外,关系运算符的优先级低于算术运算符的优先级,但高于赋值运算符的优先级。例三、若定义inta=1,b=2,c=3,f;则f=ab+c的值为0。f=a5f=00例二、若定义inta=1,b=2,c=3;则ab==c(ab)==c而且该表达式的值为0。关系运算符的结合性在结合性方面,关系运算符的结合方向是从左至右。由此例可以看出,虽然b的值介于a和c之间,但表达式a=b=c的值却为假。因此,不能根据该表达式的值来判断b是否介于a和c之间。例四、若定义inta=-3,b=-2,c=-1;则a=b=c(a=b)=c而且该表达式的值为0。实际上,要想正确描述“b的值大于等于a,而且小于等于c”这个条件,应采用如下的逻辑表达式。(a=b)&&(b=c)示例3.2!5+6其结果为6!0+6其结果为7示例3.23.3逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑运算符共有以下三种:②逻辑与运算符:&&它是一个双目运算符,例如,a&&b其运算规则是,只有a和b的值全为真时,a&&b的值才为真。③逻辑或运算符:||它是一个双目运算符,例如,a||b其运算规则是,只要a和b的值有一个为真,a||b的值就为真。①逻辑非运算符:!它是单目运算符,例如,!a其作用是颠倒真假。若a的值为真,则!a的值为假;反之亦然。逻辑运算符的优先级和结合性优先级结合方向!高自右至左算术运算符关系运算符&&自左至右||自左至右赋值运算符低逻辑运算符的优先级和结合方向如下表所示。&&的优先级高于||,!最高。由此不难看出:算术运算符、关系运算符的优先级高于&&、||。赋值运算符的优先级低于&&、||。&&、||的结合性是自左向右例四、(a=b)&&(b=c)a=b&&b=c例五、!(x=3)!x=3逻辑表达式逻辑表达式是用逻辑运算符把操作数连接起来的、符合C语法规则的式子。在C语言中,逻辑表达式的值只有真和假两个结果,真用1表示,假用0表示;相应地,逻辑表达式的类型为int型。例三、假设ac,对于逻辑表达式(a=b)&&(b=c)当b∈[a,c]时,其值为1;否则,其值为0。因此,可以使用该逻辑表达式来判断b的值是否介于a、c之间。例一、对于逻辑表达式!(x3)当x3时,其值为0;当x≥3时,其值为1。例二、对于逻辑表达式(x3)||(x=10)当x∈[3,10)时,其值为0;否则,其值为1。求解逻辑表达式应注意问题1.在C语言中,任何一个非零数据(包括字符型、实型、指针型),都被认为是真的。假设a=2,b=3,①!a的值为0。③4&&0||2的值为1。2.&&、||要求先对左侧操作数求值,而且一旦能够确定表达式的值就立即停止求解过程。①(x!=0)||(53)②intx=1;(23)&&(x=5)③a&&b&&c④a||b||c①判别整型数据n是否为偶数:3.常用的关系表达式和逻辑表达式②判别变量x的值介于a、b之间:③判别年份year是否是闰年:②a&&b的值为1。⑤’a’&&’b’的值为1④!0的值为1n%2==0(x=a)&&(x=b)(year%4==0&&year%100!=0)||year%400==0!5+6!0+6•!5+6其结果为6•!0+6其结果为73.4强制类型转换运算符在计算2+1.2时,系统会自动进行类型转换,表达式的值为3.2,类型是double。但在有些场合,自动类型转换不能达到目的,如3.14%3不合法,单靠C系统的自动类型转换无法使其合法化,需进行强制类型转换,(int)3.14%3。强制类型转换运算符的形式为:(类型)其用法是:(类型)(表达式)其功能是将一个表达式的值转换成所需的类型。例如,(int)(3.2+x)(double)(5%3)例如,floatf=3.14;,在进行(int)f强制类型转换时,系统会生成一个int中间变量用来存放转换结果3,f的值不会改变.需要注意的是,在强制类型转换时,系统会生成一个所需类型的中间变量用来存放转换结果。#includestdio.hvoidmain(){floatx;intI;x=3.6;i=(int)x;printf(“x=%f,i=%d\n”,x,i);}#includestdio.hvoidmain(){floatx;intI;x=3.6;i=(int)x;printf(“x=%f,i=%d\n”,x,i);}x=3.600000,i=3注意:强制类型转换运算优先于%运算。练习:1x=2.5,a=7,y=4.7x+a%3*(int)(x+y)%2/4注意:强制类型转换运算优先于%运算。练习:1x=2.5,a=7,y=4.7x+a%3*(int)(x+y)%2/42.53.5自增、自减运算符自增运算符:++自减运算符:--功能:使变量i的值增1用法:i++++i功能:使变量i的值减1用法:i----i一、两个表达式的求解过程不同下面以自增运算符为例加以说明。虽然++i与i++都可以使得变量i增1,但有差别。①i++是先把i的值作为表达式的值,再把i的值增1;因此,该表达式的值等于i的旧值。例如,inti=3;printf(“%d”,i++);/*输出3*/②++i是先把i的值增1,再把i的值作为表达式的值;因此,该表达式的值等于i的新值。例如,inti=3;printf(“%d”,++i);/*输出4*/示例:3.4printf(″%d,%d″,i,i++)在有的系统中,从左至右求值,输出“3,3”。在多数系统中对函数参数的求值顺序是自右而左,printf函数输出的是“4,3”。以上这种写法不宜提倡,最好改写成j=i++;printf(%d,%d,j,i)3.6赋值运算符和赋值表达式赋值运算符为=,它是双目运算符,其用法是:变量=表达式其功能是将表达式的值存放到变量中。在C语言中,变量和表达式都有自己的类型。这样一来,如果赋值运算符两端的类型不一致,那么在赋值时要进行类型转换。例一、若定义inta=5;在执行a=5后,a的值变为5。例二、若定义doublef=1.28;在执行f=3.14后,f的值变为3.14。例三、inta=5;a=3.14例四、longb=123456;b=30进行赋值运算时类型转换规律为了说明进行赋值运算时类型转换的规律,我们把数据类型排列如下,并且约定double的级别最高,下面最低,那么有如下结论:double↑float↑long,unsignedlong↑int,unsignedint↑char,shortint高低当变量的数据类型级别高于表达式的数据类型级别时,不会出现数据错误;否则,可能出现数据错误。例五、floatf;在执行f=200时,200会以浮点数形式正确地存放在f中。例六、longa=123456;intb;在执行b=a时,b的值为-7616,仅将a的低16比特存放到b中。示例:混合运算•如果有变量定义为:inti;floatf;doubled;longe;则表达式10+'a'+i*f-d/e中涉及的类型转换可以如图intcharintfloatdoublelongintdoubledoubledoubledoubleintdoubledoubledoubledouble++*-/复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。例如:a+=3等价于a=a+3x*=y+8等价于x=x*(y+8)x%=3等价于x=x%3以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。为便于记忆,可以这样理解:①a+=b(其中a为变量,b为表达式)②a+=b(将有下划线的“a+”移到“=”右侧)|___↑③a=a+b(在“=”左侧补上变量名a)C语言使用复合赋值运算符:+=,-=,*=,/=,%=赋值表达式由赋值符或复合赋值符把变量与表达式连接起来的式子,称为赋值表达式。其一般形式为:变量赋值运算符表达式例一、doublea;a=(6+2)由附录可知,算术运算符的优先级高于赋值运算符的优先级。另外,赋值运算符的结合方向是“从右向左”。因此,a=b=6a=(b=6)赋值表达式的值就是实施赋值运算后变量的值,该表达式的类型就是变量的类型。例二、a=(b=4)+(c=6)例三、a=b=c=5a=6+2对赋值表达式求解的过程是:①求赋值运算符右侧的“表达式”的值;②赋给赋值运算符左侧的变量。例如:赋值表达式“a=3*5”的值为15,执行表达式后,变量a的值也是15。注意:一个表达式应该有一个值赋值表达式左值(lvalue):赋值运算符左侧的标识符•变量可以作为左值;•而表达式就不能作为左值(如a+b);•常变量也不能作为左值,右值(lvalue):出现在赋值运算符右侧的表达式左值也可以出现在赋值运算符右侧,因而左值都可以作为右值。可以是常量、变量和表达式赋值表达式赋值表达式中的“表达式”,又可以是一个赋值表达式。例如:a=(b=5)分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“a=b”两个赋值表达式。赋值运算符按照“自右而左”的结合顺序,因此,“(b=5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价。赋值

1 / 48
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功