《表达式与操作符》PPT课件.ppt

上传人:w****2 文档编号:14731829 上传时间:2020-07-29 格式:PPT 页数:73 大小:214.50KB
收藏 版权申诉 举报 下载
《表达式与操作符》PPT课件.ppt_第1页
第1页 / 共73页
《表达式与操作符》PPT课件.ppt_第2页
第2页 / 共73页
《表达式与操作符》PPT课件.ppt_第3页
第3页 / 共73页
资源描述:

《《表达式与操作符》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《表达式与操作符》PPT课件.ppt(73页珍藏版)》请在装配图网上搜索。

1、第5章 表达式与操作符,在本章中,首先将讨论表达式和语句的组成,其次将分类介绍C语言中提供的丰富的操作符及其组成的表达式,在此过程中同时将涉及到表达式中的类型转换,然后将讨论不同表达式间的优先级和表达式的结合性。本章要重点学习以下内容:,第5章 表达式与操作符,表达式和语句的概念及其关系; 各种操作符语句的使用; 操作符之间的优先级和结合性; 了解词法分析中的分析法; 使用小括号改变操作符的执行顺序。,5.1 表达式和语句,在C语言中,语句是程序功能的基本执行单位,多个语句结合在一起可以完成一些特定的功能;而一个语句又由若干个表达式组成;此外,语句和表达式可以通过一定的手段来相互转换。本节将讨

2、论表达式和语句的概念和使用。,5.1.1 表达式,表达式是C语句的主体。在C语言中,表达式由操作符和操作数组成。操作符可以是+、-、*、/或%一类的运算操作符,也可以是、或=之类的关系操作符,还可以是其他一些操作符。操作数是操作符的操作对象,可以是常量或变量。最简单的表达式可以只含有一个操作数,例如: 7 3.1415926 “hello, world” variable,5.1.1 表达式,根据表达式含有的操作符的个数,可以把表达式分为简单表达式和复杂表达式:简单表达式是只含有一个操作符的表达式;复杂表达式含有两个或两个以上操作符。下面分析两种表达式的含义和它们的执行过程。 1简单表达式 简

3、单表达式由于只含有一个操作符,运行方式比较简单。下面列举了几个简单表达式,其中接触到的操作符在后面几节将详细讲解。 c = 2/* 表达式1 */ 4 + 25/* 表达式2 */ ptr = NULL/* 表达式3 */ key max/* 表达式4 */ fun (b)/* 表达式5 */,5.1.1 表达式,2复杂表达式 在复杂表达式中,每一个操作符和它的操作数组成的表达式为复杂表达式的子表达式。例如: b = d + e; 下列5个表达式都是复杂表达式,它们依次是上面的5个简单表达式的复杂化版本。 c = b + 2/* 表达式1 */ 4 + 25 * 3/* 表达式2 */ *pt

4、r = length/* 表达式3 */ key + incre max/* 表达式4 */ fun (7 + 5 - 3)/* 表达式5 */,5.1.2 语句,语句是计算机运行C程序的基本执行单元,一个程序是由一系列的语句组成。在C语言中,一条完整的语句由表达式和分号的。例如: /* 表达式; */ var = 2; 其中的表达式部分可以是最简单的表达式,也可以是很冗长的复杂表达式,还可以为空。最简单的语句就是一条空语句,即只有一个分号,如下所示 ;,5.1.2 语句,这个语句虽然什么都没有做,但是有时候在逻辑上却需要这样的空语句。例如,要求在一个数组里得到某个值的下标,程序如下所示: f

5、or (int i = 0; i max )就可以完成查找功能;但是,在程序结构上,for结构还需要一个循环体,因此这里需要一条空语句。关于for语句,在第5章将详细讨论。,5.1.3 复合语句,复合语句,也可以称为程序块,是包含在花括号()内的多个语句的集合。标准形式如下所示: 语句1; 语句2; 语句3; ,5.1.3 复合语句,C语言的执行都是逐条语句依次执行的。但是为了实现一些复杂的功能,很多程序常常需要把几条语句作为一个功能单元来执行,这时就需要使用复合语句把多条语句绑定为一个整体。 1组成特殊语句结构 复合语句主要用在C语言的特殊语句中,比如if语句、for语句和while语句等,

6、构成这些语句的执行体,以实现一些复杂的功能。例如,要执行一个功能:当a大于b时,互换变量a和变量b的值;当a不大于b时,什么都不做。程序如下所示: 01/* 当a大于b时,互换变量a和变量b的值 */ 02if (a b) /* if语句 */ 03c = a; 04a = b; 05b = c; 06,5.1.3 复合语句,如果不使用花括号把三条操作语句联合为复合语句,将无法实现正常的功能,例如: 01if (a b) 02c = a; 03a = b; 04b = c; 对齐代码后,等效于: 01if (a b) 02c = a; 03a = b; 04b = c;,5.1.3 复合语句,

7、2提高程序可读性 除了用在特殊语句内,复合还可以将一些完成单一功能的语句放在一个花括号中,以提高程序可读性。 3嵌套使用 复合语句还可以嵌套使用。,5.1.3 C操作符,操作符是C语言的重要组成,也是本章要讨论的重点。C语言提供了丰富的操作符,以完成各种各样的功能。C语言共有45个操作符,简单地分类展示如下: 后缀操作符(4个):() . - 算术操作符(7个):+ - * / % + - 符号操作符(2个):+ - 逻辑操作符(3个):! 02b = *ptr; 03pro = a * *ptr;/* 两个*中间以及两边的空格可以为随意多个,也可以没有 */,5.2 赋值操作符与赋值表达式,

8、赋值操作符是C语言中最常用的操作符之一,其功能是为变量赋值。由赋值操作符所组成的表达式称为赋值表达式。本节将先讨论赋值操作符和赋值表达式的使用,在介绍左值和右值的概念,最后讨论赋值表达式中常见的类型转换的问题。,5.2.1 赋值操作符,赋值操作符是一个二元操作符,其组成的赋值表达式的标准形式由变量、赋值操作符和一个表达式组成,如下所示: 变量 = 表达式; 赋值表达式的作用,就是把等号右边的表达式的值赋值给等号左边的变量。其中,赋值操作符左边的变量也称为左值,右边的表达式称为右值。赋值表达式的值即为语句执行后左值的值。,5.2.2 赋值操作符的结合性,当多个赋值操作符存在于同一条语句中时,按照

9、C标准的规定,将会按照从右到左的结合方式先执行最右边的赋值操作符,再依次向左执行其余赋值操作符。例如: a = b = c = 表达式; 该语句会先执行最右边的赋值操作符,再执行中间的,最后执行左边的,即等效于: a = (b = (c = 表达式);/* 括号操作符的优先级是最高的 */,5.2.3 左值和右值,在C语言中,左值和右值是十分重要的概念。并不是所有的值都是可以改变的,可以改变的值被称为左值。之所以要称为左值,还因为只有可以改变的值才能放在赋值操作符的左边,即只有左值可以放在赋值操作符的左边,也可以说放在赋值操作符左边的都是左值。左值可以是变量,如下所示: int year =

10、2008; int型变量year被赋值为2008。左值也可以是部分表达式,如下: int * month; *month = 2;,5.2.4 赋值表达式中的类型转换,在赋值表达式中,当把一种类型的数据赋值给不同类型的变量时,编译器会隐式地把该数据进行类型转换,转换为该变量的类型后才赋值。例如: int small = 2008; long long int large; large = small;,5.2.5 类型转换操作符,类型转换操作符是操作符中十分独特的一个,由一个小括号及包含在小括号里的一个类型名称组成,如下所示: (int) (long long int) (float) 类型转

11、换操作符也是一个一元操作符,只带一个操作数,使用时放在操作数的前面。它的作用是把操作数的值的数据类型改变为操作符中的数据类型。如下所示为类型转换操作符的标准形式: (数据类型名)(表达式),5.2.5 类型转换操作符,下面是几个使用类型转换符的实例: int i = (int) 3.11; float f = (float) 7; short int v = (short int) 28; 其中,double型常量3.11会转换为整型(会丢失数据)后赋值给int型变量i,int型变量7会转换为float型(不会丢失数据)后赋值给float型变量f,int型数据28将转换为short int型(

12、不会丢失数据)后赋值给short int型变量v。 当表达式不仅仅是一个变量或一个常量时,需要把表达式放在小括号内。例如: m = (int) (3.7 + 2.5) 这时,程序会对3.7和2.5的和类型转换为int型。如果没有括号,只是: m = (int) 3.7 + 2.5,5.3 运算操作符与运算表达式,数值计算离不开运算操作符,都要依靠运算操作符将各种数值连接在一起来完成特定的数值计算。由运算操作符组成的表达式为运算表达式。本节将讨论各种基本运算操作符和运算表达式的使用,同时还讨论与它们密切相关的符号操作符,以及运算表达式中的优先级、结合性和类型转换的问题。,5.3.1 运算操作符,

13、运算操作符共有五个,分别是加法操作符(+)、减法操作符(-)、乘法操作符(*)、除法操作符(/)和求余操作符(%)。它们均为二元操作符,即操作符前后都需要有一个操作数。,5.3.1 运算操作符,1加法操作符 加法操作符的功能即进行加法运算。例如: var = 3 + 4 + 5 + 6 + 7; 赋值操作符右侧为一个复杂的加法表达式,程序将先计算3和4的和,再计算该和与5的和,再计算该和与6的和,再计算该和与7的和,最后将最终的和赋值给var。当然,操作数也可以是变量。例如: printf(“sum = %d”, a + b);/* 变量a和b为加法操作符的两个操作数 */,5.3.1 运算操

14、作符,2减法操作符 减法操作符的功能即,进行减法运算。例如: diff = 512 128; 赋值操作符右侧即为减法表达式,将计算512和128的差作为该表达式的值,最后赋值给变量diff。,5.3.1 运算操作符,3乘法操作符 乘法操作符的功能是将它的操作数进行乘法计算,得到的值作为乘法表达式的值。例如: area = length * width; 赋值操作符右侧即为一个乘法表达式,将计算变量length和变量width的乘积作为该子表达式的值,最后将该值赋值给area。,5.3.1 运算操作符,4除法操作符 除法操作符的功能是将它的操作数进行除法运算,将得到的值作为除法表达式的值。例如:

15、 rate = distance / time; 赋值操作符右侧为一个除法表达式,其功能是计算变量distance除以变量time的商,最后将该值赋给变量rate。,5.3.1 运算操作符,5求余操作符 求余操作符的功能是求其左侧的操作数除以右侧操作数的余数。例如: digit = number % 10; 赋值操作符右侧为一个求余表达式,其作用为计算变量number除以10的余数,即变量number的个位数,最后将该值赋值给变量digit。,5.3.2 符号操作符,减法操作符(-)和加法操作符(+)不仅可以作为运算操作符,还可以作为符号操作符。 1负号操作符 负号操作符是一元操作符,其作用是

16、改变操作数的符号。它的操作数跟在操作符后面,可以是整型、浮点型或字符型的常量或变量。例如: -25 -74.0 -c -a,5.3.2 符号操作符,2正号操作符 正号操作符与负号操作符的使用方法类似,也是一元操作符,其操作数也放在操作符后面,也可以是整型、浮点型或字符型的常量或变量。但是,正号操作符的用途没有负号操作符广,因为和数学意义上的正号意义,在一个数前面加上正号不会改变该数的值。例如: +(-25) +25 +a,5.3.3 优先级与结合性,操作符的优先级是指操作符执行的先后顺序。当多个操作符共同存在于一个复杂表达式中时,需要按照一定的先后顺序执行;优先级高的操作符会比优先级低的操作符

17、先被执行。例如: result = 15 + 7 * 12 7 / 4;,5.3.3 优先级与结合性,下表总结了所有已接触到的操作符的优先级和结合性。其中优先级从上到下依次降低。,5.3.4 数值运算中的类型转换,在运算表达式中,当不同类型的数值之间进行运算时,编译器也会像在赋值表达式中那样进行隐式的类型转换。例如: area = 4 * 7.5; 其中,4为int型,7.5为double型。int型的4将先被转换为double型再与double型的7.5相乘。,5.3.4 数值运算中的类型转换,数值运算中的类型转换遵从以下规则: char型和short型数据,不管是unsigned还是sig

18、ned,在计算中都要先无条件转换为int型,即使是两个char型或short型数值相加。 float型计算前会无条件转换为double型数值,以增加精度。 其余类型的数值计算时,都要转换为数据类型级别较高的后再计算。,5.3.4 数值运算中的类型转换,数据类型级别是以能存储的数值范围来定义的,能储存的数值范围越大,数据类型级别越高。如下图所示:,5.3.5 复合的赋值操作符,赋值操作符与上面介绍的五种基本运算操作符结合,可以组成复合的赋值操作符:+=,-=,*=,/=和%=。他们使用形式与赋值操作符相似,都是二元操作符,而且左侧也只能为左值,右侧为右值;但是功能上比赋值操作符复杂。 1+= 该

19、操作符由赋值操作符与加法操作符结合而成的,其使用形式为: 左值 += 右值; 其作用为,将左值与右值相加的和赋给左值,等效于: 左值 = 左值 + 右值;,5.3.5 复合的赋值操作符,2-= 该操作符由赋值操作符与减法操作符结合而成的,其使用形式为: 左值 -= 右值; 其作用为,将左值与右值相减的差赋给左值,等效于: 左值 = 左值 - 右值; 3*= 该操作符由赋值操作符与乘法操作符结合而成的,其使用形式为: 左值 *= 右值; 其作用为,将左值与右值相乘的积赋给左值,等效于: 左值 = 左值 * 右值,5.3.5 复合的赋值操作符,4/= 该操作符由赋值操作符与除法操作符结合而成的,其

20、使用形式为: 左值 /= 右值; 其作用为,将左值与右值相除的商赋给左值,等效于: 左值 = 左值 / 右值; 5%= 该操作符由赋值操作符与求余操作符结合而成的,其使用形式为: 左值 %= 右值; 其作用为,将左值对右值求余的结果赋给左值,等效于: 左值 = 左值 % 右值;,5.4 自增、自减操作符,为了简化程序书写,C语言中还定义了两种操作符:自增操作符(+)和自减操作符(-)。这两种操作符都是一元操作符,只带一个操作数;同时,这两个操作符可以放在它们的操作数的左边,也可以放在右边,两者的功能是不同的。本节将介绍自增操作符和自减操作符的语法和使用时需要注意的问题,同时还将讨论贪婪法的内容

21、。,5.4.1 自增操作符,顾名思义,自增操作符就是使自己的值增加的操作符。准确地说,自增操作符的作用是将其唯一的操作数赋值为其自身值加1后的值。由于该操作数会被赋值,因此必须是左值,即要求其值是可以改变的。自增表达式的标准形式如下: 左值+,5.4.2 自减操作符,自减操作符与自增操作符使用方法完全一样,也为一元操作符。它可以放在其唯一的操作数(称为前自减操作符)的前面,也可以放在操作数的后面(称为后自减操作符)。自减操作符的作用是将其操作数减1后再赋值给本身。自减操作符也有前自减操作符和后自减操作符:前自减操作符是在执行所在语句前自减1,而后自减是在执行语句后自减1。,5.4.3 优先级与

22、结合性,自增操作符和自减操作符的优先级与符号操作符相同。在上面的案例中,已经接触到它们的优先级的使用,例如范例5-13中的第8行: y = -x + 1; 由于,自减操作符的级别最高,所以先执行前自减的操作。但是需要注意的是,在第12行中: y = 1 + x-;,5.4.4 词法分析:贪婪法,词法分析是指编译器把C程序中的字符处理为一个个C语言中的符号的过程。C语言中的操作符有单字符的(例如=、+、-),也有两个字符的(例如+、-),还有更多字符的(例如类型转换操作符)。由于,C语言允许两个操作符之间可以没有空格(例如v =+ d,其中=+为两个操作符),因此某些字符在一起可以组合成多种不同

23、情况的操作符,例如: +bbb;,5.4.4 词法分析:贪婪法,理论上,+除了可以视为前自增操作符,也可以视为两个正号操作符,等效于: +(+bbb); 例如: +b;/* 7个+ */ 按照贪婪法,分析的结果等效于: + + + + b; 再进行语法分析,自增操作符与加法操作符结合性为从右到左,分析结果等效于: + (+ (+ (+b);,5.4.5 自增、自减操作符的副作用,所谓自增操作符和自减操作符的副作用就是,它们在执行它们所在语句之前或之后对操作数的自增和自减操作。由于这些操作与语句是在不同阶段执行的,在一些复杂的情况下,程序员常常因此会犯错误。甚至于在不同的编译器中,这些语句的结果

24、也是不尽相同的。在编程过程中,应当尽量消除这些副作用可能导致错误的隐患。,5.5 关系操作符与关系表达式,在前面的范例中,已经接触到很多关系操作符的例子。关系操作符在C语言中主要用于进行数值比较。由关系操作符组成的关系表达式通常用在程序中的控制选择语句中。本节将讨论关系操作符和关系表达式的使用,以及关系操作符的优先级和结合性。,5.5.1 使用关系操作符,关系操作符包括小于操作符()、小于等于操作符(=)、等于操作符(=)和不等于操作符(!=)6种。使用关系操作符的标准方式如下: 1小于操作符() 表达式1 表达式2 该表达式为小于表达式,当表达式1的值小于表达式2的值时,为真;否则,为假。

25、2小于等于操作符(=) 表达式1 = 表达式2 该表达式为小于等于表达式,当表达式1的值小于等于表达式2的值时,为真;否则,为假。,5.5.1 使用关系操作符,3大于操作符() 表达式1 表达式2 该表达式为大于表达式,当表达式1的值大于表达式2的值时,为真;否则,为假。 4大于等于操作符(=) 表达式1 = 表达式2 该表达式为大于表达式,当表达式1的值大于等于表达式2的值时,为真;否则,为假。 5等于操作符(=) 表达式1 = 表达式2 该表达式为等于表达式,当表达式1的值等于表达式2的值时,为真;否则,为假。,5.5.1 使用关系操作符,6不等于操作符(!=) 表达式1 != 表达式2

26、该表达式为不等于表达式,当表达式1的值不等于表达式2的值时,为真;否则,为假。关系表达式的计算是一个比较的过程,如果被比较的两个值类型不同,必须先进行类型转换。例如: 4 4.3 12 = f 第一个表达式中,int型4要转换为double型后再比较;第二个表达式中,char型f要转换为int型后再进行比较。范例5-17演示了各种关系操作符的使用。,5.5.2 关系表达式的值,虽然C99定义了_BOOL,但现在大部分编译器并不支持这一类型,而即使_BOOL型也不是关系表达式的值类型。关系表达式值在C语言中实际上作为int型处理。同时,已经知道非0的数值的布尔值为真,而为0的数值的布尔值为假;那

27、么反来过,布尔值如何转化为int型值?关系表达式的布尔值如何转换为int型值?布尔值转换为int型值,一般遵从以下规则: 假0 真1 布尔值为真的关系表达式的int型值为1,布尔值为假的关系表达式的int型值为0。范例5-18验证了关系表达式的值和它的数据类型。,5.5.3 优先级与结合性,不同关系操作符的优先级不同,其优先级如下: 较高优先级:、=(这4个优先级相同); 较低优先级:=、!= (这2个优先级相同)。 相同优先级的关系操作符的结合性为从左到右。关系运算符的优先级比赋值运算符高,比运算操作符低,例如: m = 1 + 2 * 3 = 4;,5.6 逻辑操作符与逻辑表达式,逻辑操作

28、符包括逻辑与操作符( 上述表达式的值等于表达式n的值。范例5-22演示了逗号表达式的值及其使用方法。,5.8 操作符优先级和结合性,优先级和结合性是操作符使用中十分重要的知识,在前面的讨论中已经多次涉及。本节将总结C语言中所有操作符的优先级和结合性,包括一些本章未介绍的操作符。此外,本节还介绍了两种更好地使用表达式的方法。,5.8.1 优先级和结合性,操作符的优先级代表了它被执行的优先度。当一个复杂表达式里含有多个操作符时,一般情况下,首先会根据操作符的优先级来决定操作符的执行顺序;但操作符的优先级相同时,应该根据操作符的结合性来判断执行顺序。,5.8.1 优先级和结合性,右表是所有操作符优先

29、级和结合性的总结。,5.8.1 优先级和结合性,1前置操作符 前置操作符都是一元操作符,其优先级为2,为第二高。很容易理解将它们得结合性规定为从右到左的原因,例如: +-+a; -+b !sizeof(c) 按结合性从右到左,等效于: +(-(+a); -(+b); !(sizeof(c); 如果结合性为从左到右的话,那么第一个操作符将找不到操作数。,5.8.1 优先级和结合性,2后置操作符 两个后置操作符包括后置自增操作符和后置自减操作符。由于在这两个操作符组成的表达式中,操作数后不能带多于一个的自增操作符或自减操作符,例如: a + +; b - +;,5.8.1 优先级和结合性,3赋值类

30、操作符 赋值操作符,以及赋值操作符和其他操作符组合而成同样具有赋值功能的复合赋值操作符,统称为赋值类操作符。将赋值类操作符的结合性规定为从右到左,可以使用连等的赋值形式。例如: a = b = c += d -= 2;,5.8.1 优先级和结合性,4条件操作符 该操作符没有同级的其他操作符,只会在一个含有多个条件表达式的语句中,该操作符的结合性才会起作用。,5.8.2 使用小括号,由于C语言表达式众多,因此很难保证完全记清楚操作符间的优先级和结合性。编译器会帮助检查一些由于记错优先级导致的编程错误,比如: if (a += 3 a *= a -= 2; 第二个表达式是一个连等表达式,其中a被两次赋值。按照从右到左的结合性,第二个a先被赋值为-1。此时,表达式变为: a *= -1;,5.9 综合练习,1。请思考:若把范例5-9中的第8行改写为: if (0 (ui - 1) 程序输出结果会是什么? 2。试设计一个程序,对从屏幕输入的一个任意整数,判断其是否为4、5和6的公倍数。 3。要求设计一个程序,其功能为:对输入的一个x值,按以下的函数关系给出y值。,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!