第三章 运算符与表达式_第1页
第三章 运算符与表达式_第2页
第三章 运算符与表达式_第3页
第三章 运算符与表达式_第4页
第三章 运算符与表达式_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、 运算是对数据进行加工的过程,要运算就必须有运算符和表达式。C语言中,运算符是一种向编译程序说明一个特定的数学或者逻辑运算的符号,表达式则是一系列操作数和运算符的有效组合。 运算符是用来完成各种不同运算的一些特定符号。参加运算的数据称为运算量或操作数。运算符简称算符,也叫操作符。 C语言提供了多种运算符,按其功能可分为算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、取地址运算符等;按其所在表达式中参与运算的运算量数目,可分为单目运算符、双目运算符和三目运算符等。 3.1.1 运算符的种类 C语言中提供了丰富的运算符,按功能分主要有以下几种: 算术运算符:+ - * / % + - 关

2、系运算符: = = != 逻辑运算符:! & | 位运算符: | & 赋值运算符:=及其复合赋值运算符 条件运算符:? : 逗号运算符:, 指针运算符:* & 分量运算符:. 下标运算符: 求字节数运算符:sizeof 强制类型转换运算符:(类型) 其他运算符:如函数调用运算符( ) 3.1.2 运算符的优先级别 C语言规定了运算符的运算次序,即优先级别,简称优先级。当一个表达式中有多个运算符参加运算时,将按规定的优先级进行运算,即级别高的先参加运算,级别低的后参加运算。 C的优先级共分为15级,其中1级最高,15级最低,即圆括号“()”等的优先级最高,逗号“,”的优先

3、级最低。与数学上不同的是,C语句中的表达式里无大、中、小括号之分,一律用圆括号“()”代替。 3.1.3 运算符的结合性 所谓结合性,是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合型;反之,称为右结合型。 结合型是C语言特有的概念。除单目运算符、赋值运算符和条件运算符属右结合型外,其他运算符均属左结合型。 表达式 所谓表达式(expression),是指用运算符和圆括号“()”等将运算对象(常量、变量或函数等)连接起来的、符合C语言语法规则的式子。 表达式描述的是对哪些运算量以什么样的顺序进行什么样的操作

4、。一个表达式描述了一种操作,如x=a+b,i=i+等。每个表达式都应有一个值和类型,表达式的求值是按运算符的优先级和结合性所规定的顺序进行的。单个常量、变量或函数,均可以看做是表达式的一种特例。特例。 3.2.1 算术运算符 所谓算术运算符,是指具有算术运算功能的运算符。C语言的算术运算符如表3.1所示。 优先级:“+”,“-”,“-”(负号)最高,“*”,“/”,“%”次之,“+”,“-”(减号)最低。 结合性:“+”,“-”,“-”为右结合型,其余均为 左结合型。 与运算量的关系:“+”,“-”,“-”为单目运算符,其余均为双目运算符。 “%”运算符要求参与运算的运算量必须为整型量。“/”

5、运算结果的正负取决于被除数的符号。 “+”,“-”运算符要求参与运算的运算量必须为整型变量; 运算符“+”或“-”可以写在整型变量之前,也可以写在整型变量之后,我们把该运算符写在整型变量之前的运算称为前置运算;把该运算符写在整型变量之后的运算称为后置运算。 【说明】 (1)前置型自加1(自减1)运算+i(-i),在使用i之前,先使i的值加(减)1。 (2)后置型自加1(自减1)运算i+(i-),在使用i之后,再使i的值加(减)1。 (3)“+”和“-”只能用于整型变量,而不能用于常量或表达式,如5+或(a+b)+均是不合法的。在这种情况下,编译系统会发出警告。 【例3.1】已知i的值为6,分析

6、下列语句的运算结果。 j=+i; /*i的值自增为7,j的值为7*/ j=-i; /*i的值自减为5,j的值为5*/ j=i+; /*j的值为6,i的值自增为7*/ j=i-; /*j的值为6,i的值自减为5*/ 【例3.2】前置运算与后置运算结果的比较。 程序: 程序运行结果: 3.2.2 算术表达式 算术表达式是由算术运算符和圆括号“()”等把运算量连接起来的具有一定数学含义的,符合C语言语法的式子。例如: (1)算术表达式里在使用自增1或者自减1操作时容易出现错误 【3.3】设j的原值为5,计算以下表达式: (j+)+(j+)+(j+) (+j)+(+j)+(+j) 考虑第一个表达式是理

7、解为5+6+7=18,还是5+5+5=15 ? 第二个表达式理解为6+7+8=21,还是理解为8+8+8=24 ? 程序: #include“stdio.h” main() int m,j=5; m=(j+)+(j+)+(j+); printf(“m=%d,j=%dn”,m,j); j=5; m=(+j)+(+j)+(+j); printf(“m=%d,j=%dn”,m,j); 程序运行结果: m=15,j=8 m=24,j=8 结论:对于一个表达式里的同一个变量,如果出现多次自加自减,对于前置型来说,在所有其他运算开始之前先进行自加或者自减,对于后置型来说,等所有的其他运算都运算完之后才开始

8、自加或者自减 (2)书写表达式时,应注意括号的应用 如果有表达式: i+j 理解为(i+)+j,还是i+(+j)? C语言尽可能在处理时从左至右将若干个字符组成一个运算符,根据单目运算符的右结合性,所以应该是(i+)+j 整型变量加1减1运算:P29,【例3.4】 3.3.1 赋值运算符 赋值运算是最常用、最重要一种基本运算。“=”就是赋值运算符,不是等号(C语言的等号为“=”)。其作用是将一个表达式的值赋给一个变量。赋值运算符的优先级较低,结合方向为右结合型。 赋值运算符的左边必须是代表某一个存储单元的变量名,赋值号右边必须是C语言的合法表达式。赋值运算符,先求出右边表达式的值,然后再赋给左

9、边变量,赋值运算符的优先级只高于逗号运算符,比其它任何运算符的优先级都低。 3.3.2 复合赋值运算符 在C语言中,“+”,“-”,“*”,“/”和“%”5种算术运算符可以与赋值运算符“=”一起构成复合赋值运算符,如表3.3所示。表3.3 复合赋值运算符 例如:a+=a*=b+3等价于a=a+ (a=a*(b+3) C语言中采用复合运算符,一是为了简化程序;二是为了提高编译效率,产生质量较高的目标代码。复合赋值对初学者来说,可能有些费解,建议较少使用。 3.3.3 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子,称为赋值表达式。其一般形式如下: 变量=表达式 其中:赋值运算符“=

10、”左边必须是代表某一存储单元的变量名,而右边可以是任意表达式,甚至还可以是一个赋值表达式等。 赋值表达式的计算过程是首先计算赋值运算符“=”右边表达式的值,然后将该值赋给赋值运算符“=”左边的变量。例如:m=15+6 先计算15+6的值,再把得到的21赋给变量m。赋值表达式的值,即变量所得到的值。 赋值表达式的功能是将右侧的值赋给左侧的变量,但是需要注意的是赋值表达式本身也是有值的,它的值等于被赋值变量的值。 例如:m=n=33 由于赋值运算符是右结合型,因此先把33赋给变量n,再把表达式n=33的值33赋给变量m。 例:设a=12,计算a+=a-=a*a 先计算a-=a*a 相当于: a-=

11、144 a=a-144 a=-132 再计算: a+=-132 a=a+(-132) a= ? 计算机不仅能进行算术运算,而且能进行逻辑运算,关系运算是逻辑运算中比较简单的一种。关系运算也称为比较运算,它是将两个值进行比较,判断其比较的结果是否符合给定的条件。关系运算主要用在C语言的控制结构中。 3.4.1 关系运算符 C语言提供了6种关系运算符: 小于 大于 = 大于或等于 = 等于 != 不等于 前4种关系运算符的优先级别相同,后两种关系运算符的优先级别相同。前4种的优先级别高于后两种。 关系运算符均为双目运算符,均为左结合型。其优先级低于算术运算符,高于赋值运算符,如图所示。 3.4.2

12、 关系表达式 用关系运算符将两个表达式(可以是任意表达式)连接起来的式子,称为关系表达式。其一般形式如下:表达式 关系运算符 表达式 关系表达式的值为逻辑值,如果关系表达式成立,则其值为逻辑真,用整数1表示;如果关系表达式不成立,则其值为假,用整数0表示。 例如,已知m=4,n=3,a=6,b=5,c=4,求以下关系表达式的值。 mn 其值为1 abc 其值为0(因为大于运算符“”是自左至右的结合方向,所以先执行“ab”,关系表达式成立,逻辑值为1,再执行关系运算“1c”,关系表达式不成立,逻辑值为0) 【说明】 (1)字符型数据进行关系运算时,就是根据其 ASCII码值进行比较运算的。例如,

13、xy关系不成立,取值0,A=65关系成立,取值1。 (2)关系表达式的值可通过printf()函数输出。例如,若x=5,则printf(%d%d%d,x5,x=5,x3&83)&(83(关系运算符优先级高于逻辑运算符),其值为1;再计算83,其值为0;最后再进行1&0的运算,结果为0。 对于数学表达式表示取值范围: 例 0 x10表示x在0与10之间取值 在C语言程序中表示相同的取值,用此表达式是否成立? 在C语言中此表达式先比较0与x的值,再用其结果比较和10谁大,那么x取任何大于0的值此表达式都成立。 C语言中,要表示x在0与10之间应该写成: 0 x&x1

14、0 相当于(0 x)&(x10) 所以在作数据范围限定时,不可与数学上的应用等同。 C语言中,由&和|组成的逻辑表达式,在特定的情况下会产生一种“短路现象” 例如有以下逻辑表达式: a=0,b=0; a+&b+; 计算结果应为0&0,表达式为0,然后a为1,b为1. 但实际上系统在确定了a+为0之后,判断逻辑表达式b+无论为何值此表达式的结果都为0,因此将跳过b+不在对它进行求值,则此表达式运算完成后会出现a为1,b仍为0的情况。 例如 a=1,b=1;a+|b+; 表达式在运算a+后得出表达式的值总为1,因此也将跳过b+,所以最后的结果a为2,b为1。 3.7

15、.1 条件运算符 条件运算符“? :”是C语言中唯一的三目运算符,其优先级较低,仅高于赋值运算符,结合方向为右结合型。由它构成的表达式称为条件表达式。其一般形式如下:e1 ? e2 : e3其中,e1,e2,e3分别是3个任意表达式。若 e1的值为真(非0),则此条件表达式的值为e2的值;若e1的值为假(0),则此条件表达式的值为 e3的值。条件表达式允许嵌套。 【例3.5】输入两个数,求其中的最小值。 程序: 3.7.2 逗号运算符 C语言提供的逗号运算符是一种特殊的运算符,用它连接多个表达式可以构成逗号表达式。其一般形式如下:表达式1,表达式2,表达式n 逗号运算符的优先级最低,结合方向是

16、自左至右。逗号表达式的求解过程是先求解表达式1,再求解表达式2,依次类推,最后求解表达式n。整个逗号表达式的值是最后一个表达式的值,因此逗号运算符又称为“顺序求解运算符”。 由于逗号运算符的级别最低。所以是否带括号,结果是不同的 例如:a=(b=4,b5)变量a赋值为9。赋值运算表达式“a=(b=4,b5)”中的括号内是逗号表达式,先将4赋给b;然后计算表达式b5,其值为9,最后将值9赋给变量a。 不带括号: a=b=4,b+5 3.7.4 强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需要的类型。其一般形式如下: (要转换成的数据类型) (被转换的表达式) 例如: (do

17、uble)x; /*将x的值强制转换成double类型*/ (int)(x+y); /*将x+y的值强制转换成int型*/ (float)(5%3); /*将5%3的值强制转换成float型*/ 【注意】 被转换的表达式要用括号括起来,否则只转换紧挨在强制类型转换运算符后的变量。如(int)x+y表示将变量x转换为整型后,再与y相加。 需要说明的是,在强制类型转换过程中,仅得到一个所需类型的中间变量,原来变量的类型并未发生变化。 【例3.8】强制类型转换。 程序: C语言允许不同类型的数据混合运算。 例如:12+a+12.6-123.456*c是合法的。在进行运算时,不同类型的数据要先转换成同

18、一类型,然后再进行运算。转换的规则如图3.8.1所示。图3.8.1 不同类型数据的转换规则 图中横向向左的箭头表示必定的转换,如char型、short型数据必定先转换为int型,float型数据在运算时一律先转换成double型,以提高运算精度。 纵向的箭头表示当运算对象为不同类型时转换的方向。如int型与double型数据进行运算,先将int型的数据转换成double型,然后将两个同类型(double型)数据进行各种运算,结果为double型。 【说明】 (1)一般情况下,当数据类型不同时,低级向高级转换。占有字节数较长的类型级别较高,占有字节数较短的类型级别较低(“高看齐”)。 (2)在赋值运

温馨提示

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

评论

0/150

提交评论