C语言程序设计第03章 表达式与操作符_第1页
C语言程序设计第03章 表达式与操作符_第2页
C语言程序设计第03章 表达式与操作符_第3页
C语言程序设计第03章 表达式与操作符_第4页
C语言程序设计第03章 表达式与操作符_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、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 /赋值

2、表达式。赋值过程是a=b; c=a; rand()%10 /混合表达式。产生一个0 至9 的随机数 表达式都有一个值。 赋值操作符左边的表达式称为左值,右边的表达式称为右值。左值应该表示变量。,运算符与表达式概述,运算符一般要携带若干运算对象,运算对象称为操作数。根据操作数的个数,运算符可以分为单目运算符、双目运算符和三目运算符。 表达式由运算符和相应的操作数以及用于描述运算先后次序的括号构成。 为了表达式的书写方便(可以少写一些括号),C引进了运算符优先级和结合方向的概念。 运算符的结合方向(结合性)规定了同优先级运算符相遇时候的运算次序。 C运算符有两种结合方向:自左向右结合(左结合性),

3、即运算对象先与左面的运算符结合;自右向左结合(右结合性),即运算对象先与右面的运算符结合,常量、变量或函数调用,srand(time(0); rand(); 计算机没有办法产生真正的随机数的,是用算法模拟,所以你只调用rand,每次出来的东西是一样的。设置一个种子后,根据种子的不同,就可以产生不同的数了。而怎么保证种子的不同呢?最简单的办法当然是用永远在向前的时间。就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数, 用1970.1.1至今的秒数,初始化随机数种子。,示例3.1,3.2 关系运算符和关系表达式, :大于,例如, ab x(y+3) =:大于等于,例

4、如, a=b, :小于,例如, ab =:小于等于,例如, a=b, =:等于,例如, a=b !=:不等于,例如, a!=b a!=0,关系表达式是用关系运算符把操作数连接起来的、符合C语法规则的式子。,例一、对于关系表达式 a != 0 当a0时,其值为1;当a=0时,其值为0。,关系运算符都是双目运算符,用于将两个操作数进行比较, 共有以下几种:,关系表达式的值只有“真”和“假”两个结果,真用 1 表示,假用0 表示;相应地,关系表达式的类型为 int 型。,关系运算符的优先级,在优先级方面,、=、= 的优先级高于 =、!= 。,另外,关系运算符的优先级低于算术运算符的优先级,但高于赋值

5、运算符的优先级。,例三、若定义 int a=1,b=2,c=3,f; 则f=ab+c 的值为0。,f=a5,f=0,0,关系运算符的结合性,在结合性方面,关系运算符的结合方向是从左至右。,由此例可以看出,虽然b的值介于a和c之间,但表达式 a=b=c 的值却为假。因此,不能根据该表达式的值来判断b是否介于a和c之间。,实际上,要想正确描述“b的值大于等于a,而且小于等于c”这个条件,应采用如下的逻辑表达式。 (a=b) (23),在进行 (int)f 强制类型转换时,系统会生成一个int中间变量用来存放转换结果3,f的值不会改变.,需要注意的是,在强制类型转换时,系统会生成一个所需类型的中间变

6、量用来存放转换结果。,#include void main() float x; int I; x=3.6; i=(int)x; printf(“x=%f,i=%dn”,x,i); ,#include void main() float x; int I; x=3.6; i=(int)x; printf(“x=%f,i=%dn”,x,i); x=3.600000,i=3,注意:强制类型转换运算优先于%运算。 练习: 1 x=2.5,a=7,y=4.7 x+a%3*(int)(x+y)%2/4,注意:强制类型转换运算优先于%运算。 练习: 1 x=2.5,a=7,y=4.7 x+a%3*(int

7、)(x+y)%2/4 2.5,3.5 自增、自减运算符,自增运算符:+ 自减运算符:-,功能:使变量i的值增1,用法:i+ +i,功能:使变量i的值减1,用法:i- -i,一、两个表达式的求解过程不同,下面以自增运算符为例加以说明。虽然+i与i+都可以使得变量i增1,但有差别。, i+是先把i的值作为表达式的值,再把i的值增1;因此,该表达式的值等于i的旧值。例如, int i=3; printf(“%d”,i+); /*输出3*/, +i是先把i的值增1,再把i的值作为表达式的值;因此,该表达式的值等于i的新值。例如, int i=3; printf(“%d”,+i); /*输出4*/,示例

8、:3.4,printf(,i+) 在有的系统中,从左至右求值,输出“,”。在多数系统中对函数参数的求值顺序是自右而左,函数输出的是“,”。以上这种写法不宜提倡, 最好改写成 j = i+; printf(%d, %d, j,i),3.6 赋值运算符和赋值表达式,赋值运算符为 = ,它是双目运算符,其用法是: 变量=表达式 其功能是将表达式的值存放到变量中。,在C语言中,变量和表达式都有自己的类型。这样一来,如果赋值运算符两端的类型不一致,那么在赋值时要进行类型转换。,例一、 若定义 int a=5; 在执行 a=5 后,a的值变为5。,例二、 若定义 double f=1.28; 在执行 f=

9、3.14 后,f的值变为3.14。,例三、 int a=5; a=3.14,例四、 long b=123456; b=30,进行赋值运算时类型转换规律,为了说明进行赋值运算时类型转换的规律,我们把数据类型排列如下,并且约定double的级别最高,下面最低,那么有如下结论:,double float long ,unsigned long int ,unsigned int char, short int,高,低,当变量的数据类型级别高于表达式的数据类型级别时,不会出现数据错误;否则,可能出现数据错误。,例五、float f; 在执行f=200时,200会以浮点数形式正确地存放在f中。,例六、l

10、ong a=123456; int b; 在执行b=a时,b的值为-7616,仅将a的低16比特存放到b中。,示例:混合运算,如果有变量定义为:int i; float f; double d; long e;则表达式10+a+i*f-d/e中涉及的类型转换可以如图,复合的赋值运算符,在赋值符“”之前加上其他运算符,可以构成复合的运算符。 例如: 等价于 * 等价于 *() 等价于 ,以“”为例来说明,它相当于使进行一次自加()的操作。即先使加,再赋给。,为便于记忆,可以这样理解: a += b (其中a为变量,b为表达式) a += b(将有下划线的“a+”移到“=”右侧) |_ a = a

11、 + b (在“=”左侧补上变量名a),语言使用复合赋值运算符: ,*,,赋值表达式,由赋值符或复合赋值符把变量与表达式连接起来的式子,称为赋值表达式。其一般形式为: 变量 赋值运算符 表达式,例一、 double a; a=(6+2),由附录可知,算术运算符的优先级高于赋值运算符的优先级。,另外,赋值运算符的结合方向是“从右向左”。因此, a=b=6 a=(b=6),赋值表达式的值就是实施赋值运算后变量的值,该表达式的类型就是变量的类型。,例二、a=(b=4)+(c=6),例三、a=b=c=5,a=6+2,对赋值表达式求解的过程是: 求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变

12、量。 例如: 赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。,注意: 一个表达式应该有一个值,赋值表达式,左值 (lvalue) : 赋值运算符左侧的标识符 变量可以作为左值; 而表达式就不能作为左值(如a+b); 常变量也不能作为左值,,右值 (lvalue) :出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。 可以是常量、变量和表达式,赋值表达式,赋值表达式中的“表达式”,又可以是一个赋值表达式。例如: a=(b=5),分析:括弧内的“b=5”是一个赋值表达式,它 的值等于5。执行表达式“a=(b=5)”相当于执行 “b=5”和

13、“ab”两个赋值表达式。 赋值运算符 按照“自右而左”的结合顺序,因此,“(b5)” 外面的括弧可以不要,即“a=(b=5)”和“a=b=5” 等价。,赋值表达式,请分析下面的赋值表达式(a=3*5)=4*3,分析:先执行括弧内的运算,将15赋给a,然后执行 4*3的运算,得12,再把12赋给a。最后a的值为12, 整个表达式的值为12。可以看到(a=3*5)出现在赋 值运算符的左侧,因此赋值表达式(a=3*5)是左值,注意:在对赋值表达式(a=3*5)求解后,变量a得到值 15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变 量a,而不是赋给3*5。,不能写成: a=3*5=4*

14、3,赋值表达式,赋值表达式也可以包含复合的赋值运算符。 如:a+=a-=a*a,分析:此赋值表达式的求解步骤如下 先进行“*”的运算, 它相当于*,a的值为144132。 再进行“”的运算,相当于=a+(-132),a的值为132-132-264。,赋值表达式,将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。 如:printf(%d,a=b);,分析:如果b的值为3, 则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。,练习: 已知:a=12 a+=a a-=2 a*=2+3 a/=

15、a+a a%=(5%2) x=10,求x+=x-=x-x,已知:a=12 a+=a 24 a-=2 10 a*=2+3 60 a/=a+a 0 a%=(5%2) 0 x=10,求x+=x-=x-x 20,3.7 条件运算符,下面介绍一个与if语句功能类似的运算符,即条件运算符。 条件运算符是唯一的三目运算符,其一般形式如下: 表达式1?表达式2 : 表达式3 由该运算符构成的表达式称为条件表达式。例如,,首先求解表达式1,若表达式1的值为真,则求解表达式2,并且把表达式2的值作为整个条件表达式的值;若表达式1的值为假,则求解表达式3,而且把表达式3的值作为整个条件表达式的值。,值为a、b中的较

16、大者,ab ?a : b,条件表达式的求解过程如下:,运算符的优先级与结合性 条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为“从右到左”(即右结合性)。,示例:3.6 练习: 输入一个字符,判别是否为大写字母,如果是,将它转换成小写字母,如果不是不转换。,输入一个字符,判别是否为大写字母,如果是,将它转换成小写字母,如果不是不转换。 #include void main() char ch; scanf(“%c”, ,3.8 逗号运算符和逗号表达式,逗号运算符:将两个表达式连接起来,又称为“顺序求 值运算符” 如:5,,一般形式: 表达式,表达式,求解过程: 先求解表达式,再求解表达式。整个逗号表达式的值是表达式的值。,逗号表达式 的值为14,例:逗号表达式*5,*,分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解*5。,的值为5,然后求解*,得。整个逗号表达式的值为。,一个逗号表达式又可以与另一个表达式组成一 个新的逗号表达式 如:(*,*) 先计算出的值等于,再进行*的运算得60(但值未变,仍为15),再进行得,即整个表达式的值为。,逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式 它的值为表达式的值。,逗号运算符是所有运算符中级别最低的 例: (,*) ,*3,赋值表达式,将一个逗号表达式的值赋给,的值等于,逗号表

温馨提示

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

评论

0/150

提交评论