版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章第二章 数据类型、运算符和表达式数据类型、运算符和表达式 数据是程序处理的对象,是程序设计中数据是程序处理的对象,是程序设计中的重要组成部分。的重要组成部分。C语言为我们提供了丰富的语言为我们提供了丰富的数据类型和运算符及语法规那么。数据类型和运算符及语法规那么。 内容内容:C语言的根本数据类型、标识符和语言的根本数据类型、标识符和关键字、常量和变量,运算符与表达式以及关键字、常量和变量,运算符与表达式以及数据类型之间的转换等。数据类型之间的转换等。 要求要求:掌握掌握C语言数据和数据类型的相关语言数据和数据类型的相关知识,纯熟掌握运算符和表达式的使用方法。知识,纯熟掌握运算符和表达式的
2、使用方法。2.1.1 数据类型概述数据类型概述整型(整型(int)数据类型基本类型基本类型整型整型单精度型(单精度型(float)字符型(字符型(char)长整型(长整型(long)短整型(短整型(short)实型实型双精度型双精度型(double)枚举类型(枚举类型(enum)(第)(第9章)章)共用体类型(共用体类型(union)(第)(第9章)章)构造类型构造类型结构体类型(结构体类型(struct)(第)(第9章)章)数组类型(第数组类型(第6章)章)空类型(空类型(void)指针类型(指针类型(* *)(第(第8章)章)2.1 数据类型数据类型2.1.2 整型整型 根据存储长度的不同
3、,根据存储长度的不同,C语言中的整型语言中的整型又可分为:根本整型、短整型和长整型,分又可分为:根本整型、短整型和长整型,分别用别用int根本整型、根本整型、short int或或short短整型、短整型、long int或或long长整型来长整型来描绘。在这些类型标识符之前还可以加上修描绘。在这些类型标识符之前还可以加上修饰符饰符unsigned以表示数据是无符号数以表示数据是无符号数0和和正整数,没有加正整数,没有加unsigned的数据类型为有的数据类型为有符号类型,可以描绘正整数、负整数和符号类型,可以描绘正整数、负整数和0。2.1 数据类型数据类型表表2-1 整数类型整数类型 类 型
4、 字节数 取值范围 int2-32768 32767 即即 -215 215 1unsigned int 20 65535 即即 0 216 1short2-32768 32767 即即 -215 215 -1unsigned short20 65535 即即 0 216 -1long4-21474836482147483647 即即 -231 231 -1unsigned long404294967295 即即 0 232 -1参考参考p18整形数据的存储整形数据的存储2.1.3 实实 型型 实数类型的数据即通常的实型数据,例如实数类型的数据即通常的实型数据,例如123.45、-36.9、0
5、.0、-2.810-5等。由于计算等。由于计算机中存储实型数据时小数点位置不确定,机中存储实型数据时小数点位置不确定,C语语言中实型数据又称浮点型数据。言中实型数据又称浮点型数据。Turbo C提供提供了三种表示实数的类型:单精度浮点数类型,了三种表示实数的类型:单精度浮点数类型,简称浮点类型,类型名为简称浮点类型,类型名为float;双精度浮点数;双精度浮点数类型,简称双精度类型,类型名为类型,简称双精度类型,类型名为double;长;长双精度类型,类型名为双精度类型,类型名为long double。所有整。所有整数类型和实数类型统称为算术类型。数类型和实数类型统称为算术类型。表表2-2 实
6、数类型实数类型 类 型字节数有效数字数值范围float47-3.410-38 3.41038double816-1.710-308 1.710308long double1019-3.410-4932 3.4104932以上数据为理论上的参考数据,实际上不同机器可能有以上数据为理论上的参考数据,实际上不同机器可能有差异,例如在有的机器上测试为:差异,例如在有的机器上测试为:-1.2E-383.4E+38float -2.3E-3081.7E+308double-9.0E-49286.3E+4931long double。注意:在注意:在Turbo C 2.0中默认输出中默认输出6位小数,输出位
7、小数,输出double时加时加l修饰修饰,输出输出long double加加L修饰。修饰。 2.1.4 字符型字符型字符类型的数据即通常的字符。字符类型的数据即通常的字符。 C语言中字符数据的书写形式是用语言中字符数据的书写形式是用单引号单引号括括起的单个字符,例如用起的单个字符,例如用a、B、4分别表分别表示示a、B、4字符等,以与源程序中所用的字符相字符等,以与源程序中所用的字符相区别。区别。 字符数据主要用于表示信息,例如程序的字符数据主要用于表示信息,例如程序的输入和输出信息。此外,文字处理方面的应用输入和输出信息。此外,文字处理方面的应用程序也必须能使用和处理字符形式的数据。程序也必
8、须能使用和处理字符形式的数据。 字符类型的数据包括计算机所用编码字符集字符类型的数据包括计算机所用编码字符集中的所有字符。常用的中的所有字符。常用的ASCII字符集,其中的字字符集,其中的字符包括所有符包括所有大小写英文字母、数字、各种标点符大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共号字符,还有一些控制字符,一共128个个。扩展。扩展的的ASCII字符集包括字符集包括ASCII字符集中的全部字符和字符集中的全部字符和另外的另外的128个字符,总共个字符,总共256个字符。个字符。 字符类型数据在内存中字符类型数据在内存中存储的是它的存储的是它的ASCII码编码值码编码值,例
9、如,例如A和和8分别存储分别存储ASCII值值65和和56。一个字符通常占用内存一个字节。一个字符通常占用内存一个字节。 2.1.4 字符型字符型 字符数据与整型数据是相似的。字符数据与整型数据是相似的。C语言规定字符语言规定字符类型与整型根本一致,即也有有符号和无符号两种类型与整型根本一致,即也有有符号和无符号两种类型:类型: 有符号类型用有符号类型用char-128127表示表示; 无符号类型用无符号类型用unsigned char0255 表表示示;类类 型型字节数字节数取值范围取值范围char1-128 127 即即 -27 27 1unsigned char10 255 即即 0 2
10、8 -12.1.4 字符型字符型2.2 标识符、常量与变量标识符、常量与变量 2.2.1 标识符标识符1. 标识符标识符 所谓所谓标识符标识符,是指程序中的变量、符号常量、,是指程序中的变量、符号常量、数组、函数、类型、文件等对象的名字。在数组、函数、类型、文件等对象的名字。在C语语言中,言中,标识符只能由字母、数字和下划线组成,标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线且第一个字符必须为字母或下划线。使用标识符。使用标识符的详细规那么如下:的详细规那么如下:1. 标识符使用规那标识符使用规那么么1 标识符只能由下划线、数字标识符只能由下划线、数字09与大小写字母与大小
11、写字母az,AZ构成。构成。Turbo C最多识别由最多识别由32个字符组成的标识符,个字符组成的标识符,Microsoft C最多识别由最多识别由8个字符组成的标识符。个字符组成的标识符。 2 标识符的首个字符必须是字母或下划线,而不能是标识符的首个字符必须是字母或下划线,而不能是数字或其它符号。数字或其它符号。3 C语言中语言中大小写字母是敏感大小写字母是敏感的,即在标识符中,大的,即在标识符中,大写字母和小写字母代表不同的意义。例如:写字母和小写字母代表不同的意义。例如:Name和和name是两个不同的标识符。是两个不同的标识符。4 标识符不能使用系统的关键字标识符不能使用系统的关键字p
12、12,因为关键,因为关键字是系统保存的,它们已有特定的含义。字是系统保存的,它们已有特定的含义。 5 系统预定义标识符,如预编译命令名系统预定义标识符,如预编译命令名define、include、系统函数名、系统函数名scanf、printf、getchar、putchar等可作为用户标识符,等可作为用户标识符,但建议不作它用。但建议不作它用。6 尽量作到尽量作到“见名知义,例如见名知义,例如max、score等,而不用象等,而不用象abc、x1、y2等标识符。等标识符。7 防止使用易混字符,如防止使用易混字符,如1、l、i;0、o;2、z等。等。1. 标识符使用规那标识符使用规那么么2. 关
13、键字关键字关键字关键字是指系统预定义的保存标识符,又称之为是指系统预定义的保存标识符,又称之为保存字。它们有特定的含义,不能再作其它用处保存字。它们有特定的含义,不能再作其它用处使用。使用。ANSI C定义的关键字共定义的关键字共32个:个: autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsigned continue forsignedvoiddefault gotosizeofvolatile doifwhilestatic2.2.2 常常
14、 量量1.整型常量整型常量1 十进制整数:十进制整数:如如154、-565、6523。十进制写法中除。十进制写法中除非要写的整数本身就是非要写的整数本身就是0否那么第一个数字字符不能为否那么第一个数字字符不能为0。假如要说明是十进制无符号整数那么在数据后加假如要说明是十进制无符号整数那么在数据后加u或或U,如,如65535u,12345U等。等。2 八进制整数:八进制整数:以以0开头,由开头,由07八个数字组成的数是八八个数字组成的数是八进制数。如进制数。如0101、-045等是合法的八进制数,其中等是合法的八进制数,其中0101相当相当于十进制数于十进制数65。而。而0185、-02a3是错
15、误的,不能表示八进制是错误的,不能表示八进制数为什么?。数为什么?。 C语言中的数据有常量和变量之分,常量是指在程序运行语言中的数据有常量和变量之分,常量是指在程序运行过程中其值不能被改变的量过程中其值不能被改变的量3 十六进制整数:十六进制整数:以以0 x或或0X开头的数字序列开头的数字序列表示十六进制数。如表示十六进制数。如0 x12为十六进制数,它相当为十六进制数,它相当于十进制数于十进制数18。由于数字只有。由于数字只有10个,而在十六进个,而在十六进制写法中需要制写法中需要015共共16个数字,超过个数字,超过9的数字不的数字不能用单个数字表示,能用单个数字表示,C语言采用计算机领域
16、通用的语言采用计算机领域通用的方式,用字母方式,用字母af或或AF表示其余的表示其余的6个十六进制个十六进制数字,其对应关系如表数字,其对应关系如表2-4所示:所示:字字 母母a,Ab,Bc,Cd,De,Ef,F表示的数字表示的数字101112131415表2-4 十六进制数字的表示方法2.2.2 常常 量量【注意注意】八进制、十进制和十六进制只是整数的不同书八进制、十进制和十六进制只是整数的不同书写形式,提供多种写法只是为了使用方便,我们可以根据写形式,提供多种写法只是为了使用方便,我们可以根据需要选择适当的书写方式。日常生活中我们习惯使用十进需要选择适当的书写方式。日常生活中我们习惯使用十
17、进制数,而在计算机中存储的数据都是二进制的,由于二进制数,而在计算机中存储的数据都是二进制的,由于二进制与八进制和十六进制的换算关系简单,有些情况下用八制与八进制和十六进制的换算关系简单,有些情况下用八进制和十六进制的写法会更方便些。但无论何种写法,上进制和十六进制的写法会更方便些。但无论何种写法,上述数据类型仍然是述数据类型仍然是整型整型,并不是其他新的类型。另外还要,并不是其他新的类型。另外还要注意:注意:C语言中不用二进制形式表示整数。语言中不用二进制形式表示整数。 2.2.2 常常 量量长整型常量的表示方法:长整型常量的表示方法: 在上述方法表示的整数后面后附一个字母在上述方法表示的整
18、数后面后附一个字母l 或或L作后缀作后缀,即可表示该数据的类型是长整型的。即可表示该数据的类型是长整型的。 例如例如65L、-234234L表示十进制有符号长整型表示十进制有符号长整型数,数,345678lu,35LU等表示十进制无符号长整型数。等表示十进制无符号长整型数。2.2.2 常常 量量2.实型常量实型常量在在C语言中,把带小数的数称为实数或浮点数。语言中,把带小数的数称为实数或浮点数。实型常量只能用实型常量只能用十进制十进制形式表示。形式表示。表示方法:表示方法:1小数形式。小数形式。由数字序列和小数点组成,如由数字序列和小数点组成,如3.14159、-0.12、.5、2.等都是合法
19、的实数形式。等都是合法的实数形式。2 指数形式。指数形式。由一个整数或小数后面跟有一由一个整数或小数后面跟有一个指数部分组成,指数部分以个指数部分组成,指数部分以e或或E开头跟一个正开头跟一个正的或负的整数,表示以的或负的整数,表示以10为底的指数。如:为底的指数。如:3.4e-4或或3.4E-4表示表示3.410-4,1.23E4、1.23E+4、1.23e4或或1.23e+4均表示均表示1.23104。 2.2.2 常常 量量注意:注意:字母字母e或或E之前即尾数部分必须有之前即尾数部分必须有数字,例如数字,例如E2是不合法的表示。是不合法的表示。e或或E后面的后面的指数部分必须是整数,指
20、数部分无整数或为小数指数部分必须是整数,指数部分无整数或为小数均是错误的,例如均是错误的,例如1.0e 和和4e-4.5均是不合法的表均是不合法的表示。示。 3.14159可表示为:可表示为:0.0314159102C语言表示为语言表示为0.0314159e+2;或或3141.5910-3C语言表示为语言表示为3141.59e-3 2.2.2 常常 量量3.字符常量字符常量 字符型常量是由一对字符型常量是由一对单引号单引号括起来的括起来的单个字单个字符符构成。构成。 例如:例如:a、B、2等等 一个字符型常量的存储值是该字符集中对应一个字符型常量的存储值是该字符集中对应的的ASCII编码值,常
21、用字符的编码值,常用字符的ASCII编码值如下:编码值如下:AZ6590,az97122,094857,空格字符空格字符32 。 可以看出:大写字母、小写字母、数字字符可以看出:大写字母、小写字母、数字字符ASCII编码值都是连续的。编码值都是连续的。 2.2.2 常常 量量 除了可见字符以外,还有一些特殊的控除了可见字符以外,还有一些特殊的控制字符无法直接写出,例如换行符等。制字符无法直接写出,例如换行符等。C语语言为它们规定了特殊写法:以反斜杠言为它们规定了特殊写法:以反斜杠开开头的一个字符或一个数字序列,这类字符称头的一个字符或一个数字序列,这类字符称为转义字符为转义字符. 如如:n、2
22、14等等 ,详细见下表。详细见下表。转义字符转义字符2.2.2 常常 量量字符形式字符形式功功 能能n换行,将光标从当前位置移到下一行开头换行,将光标从当前位置移到下一行开头t横向跳格,光标跳到下一个程度制表位,横向跳格,光标跳到下一个程度制表位,一个制表位占一个制表位占8列列b退格退格,将当前位置移到前一列将当前位置移到前一列r回车,将光标从当前位置移到回车,将光标从当前位置移到本行开头本行开头f换页,将光标从当前位置移到下一页开头换页,将光标从当前位置移到下一页开头反斜杠字符反斜杠字符“单引号字符单引号字符“双引号字符双引号字符“ddd1到到3位位8进制数进制数所代表的字符所代表的字符xh
23、h1到到2位位16进制数进制数所代表的字符所代表的字符2.2.2 常常 量量mainprintfab ct derftgn;printfhtibbj k;说明,这里为了方便学生阅读,使用说明,这里为了方便学生阅读,使用代表空格,但学生在计算机进展程代表空格,但学生在计算机进展程序代码书写时直接按空格键即可。序代码书写时直接按空格键即可。通过程序调试可以看到程序运行结果如下:通过程序调试可以看到程序运行结果如下:f gdeh j k例、分析下面程序运行的结果例、分析下面程序运行的结果4.字符串常量字符串常量字符串常量是由一对字符串常量是由一对双引号双引号括起的字符序列括起的字符序列. 例如例如“
24、abc、“a等等,其中其中“a的存储形的存储形式式: 字符串常量与字符常量的区别:字符串常量与字符常量的区别: 1 字符常量由单引号括起来,字符串常量由双引号字符常量由单引号括起来,字符串常量由双引号括起来括起来2 字符常量只占一个字节的内存空间,字符串常量字符常量只占一个字节的内存空间,字符串常量存储串中所有字符和串完毕标记存储串中所有字符和串完毕标记0,其,其ASCII值为值为0 3 字符常量只能表示单个字符;而字符串常量那么字符常量只能表示单个字符;而字符串常量那么可以含一个或多个字符,甚至还可以没有字符。可以含一个或多个字符,甚至还可以没有字符。 a02.2.2 常常 量量参考参考P1
25、5例例5.符号常量符号常量 以上介绍了以上介绍了C语言几种类型常量的直接表语言几种类型常量的直接表示形式,又叫示形式,又叫“直接常量。与此相对应的还直接常量。与此相对应的还有所谓的有所谓的“符号常量符号常量。符号常量就是使用标。符号常量就是使用标识符定义一个常量,例如可用如下方法定义识符定义一个常量,例如可用如下方法定义PI代表代表3.14159: #define PI 3.14159 这种常量定义在这种常量定义在C语言中被称之为语言中被称之为“宏定宏定义,详细方法将在本书第义,详细方法将在本书第11章中介绍。章中介绍。 2.2.2 常常 量量/* EX2-1.C */#define PI 3
26、.14159main float r,c,s; scanf%f,&r; c=2*PI*r; s=PI*r*r; printfr=%f,c=%f,s=%fn,r,c,s;【例例2-1】输入圆的半径,计算周长和面积输入圆的半径,计算周长和面积2.2.3 变变 量量变量是指在程序运行过程中其值可以被改变的量变量是指在程序运行过程中其值可以被改变的量 三个要素:三个要素:变量名变量名变量的存储单元变量的存储单元变量存储单元存放的值。变量存储单元存放的值。 1.变量的定义变量的定义类型类型 变量名变量名=初值初值,变量名,变量名=初值初值,;例如下面的两条变量定义语句例如下面的两条变量定义语句 int
27、a; float f; int a,b,c,max;int a=1,b=2,c=3,max;不能用不能用 int a=b=c=3;int a=3,b=3,c=3;2.2.3 变变 量量1编译系统将根据定义检测函数中的变量名。编译系统将根据定义检测函数中的变量名。 例如在语句例如在语句: maxx=3; 中变量中变量max错写成了错写成了maxx,编译系统将提示,编译系统将提示maxx没有被没有被定义的错误信息。定义的错误信息。2编译系统将对每一个变量根据它被定义的类型分配相应编译系统将对每一个变量根据它被定义的类型分配相应的存储单元。的存储单元。 例如对上述被定义的变量例如对上述被定义的变量a
28、、b、c和和max分别分配分别分配2字节的字节的整型存储单元,对变量整型存储单元,对变量f分配分配4字节的单精度实型存储单元。字节的单精度实型存储单元。 可以用长度运算符可以用长度运算符sizeof 求出任意类型变量存储单元的求出任意类型变量存储单元的字节数。例如对字节数。例如对int型变量型变量a和和float型变量型变量f,sizeofa和和sizeoff的值分别为的值分别为2和和4。也可以用。也可以用sizeof 作用到类型作用到类型标识符上,如:标识符上,如:sizeofint和和sizeoffloat得到同样的结果。得到同样的结果。2.2.3 变量定义的作用变量定义的作用2.2.3
29、变量定义的作用变量定义的作用3编译系统根据变量被定义的类型检查该变量进展运编译系统根据变量被定义的类型检查该变量进展运算的合法性。算的合法性。例如上述整型变量例如上述整型变量a、b、c和和max均可以参与求余运算,均可以参与求余运算,例如例如b对对c求余的结果赋给求余的结果赋给a: a=b%c;是合法的,而实型变量是合法的,而实型变量f参加求余运算将是非法的。参加求余运算将是非法的。4可以给变量赋初始值。可以给变量赋初始值。假如没有赋初值,普通变量假如没有赋初值,普通变量将存储将存储随机值随机值,直到给它赋值为止。,直到给它赋值为止。定义变量应注意以下问题:定义变量应注意以下问题:1变量名可以
30、是任何合法的标识符。变量名可以是任何合法的标识符。 例如例如a、b2、c_1、_3y等均是合法的变量名,而等均是合法的变量名,而#abc、 、¥、¥b1、5fd2、for等均是不合法的变量等均是不合法的变量名。名。 .见名知义见名知义. 区分大小写字母区分大小写字母2在一个函数中,同一个变量不能被定义两次。在一个函数中,同一个变量不能被定义两次。2.2.3 变量定义的作用变量定义的作用2. 变量的赋值变量的赋值 变量的赋值就是给变量的存储单元存储一定变量的赋值就是给变量的存储单元存储一定的值。赋值操作由赋值运算符的值。赋值操作由赋值运算符“=实现。实现。 赋值方式赋值方式: 1在定义变量时给变
31、量初始化赋值在定义变量时给变量初始化赋值 2在程序运行时用赋值语句给变量赋值,在程序运行时用赋值语句给变量赋值,如:如: inta,b,c; a=3;b=5;c=7; 与初始化赋值不同,用赋值语句给多个变量与初始化赋值不同,用赋值语句给多个变量赋一样的值可以采用连续赋值的形式。如:赋一样的值可以采用连续赋值的形式。如: a=b=c=26;3.整型数据的存储整型数据的存储补码补码complement 216-|a| -32768a0a的补码的补码 =a 0a327674.整型数据的溢出整型数据的溢出 由于在计算机中只能用有限的二进制位存放由于在计算机中只能用有限的二进制位存放数据,各种类型数据的
32、存储都有溢出问题。对整型数据,各种类型数据的存储都有溢出问题。对整型数据的存储,溢出的情况有:数据的存储,溢出的情况有: 1由于存储的位数有限,绝对值大于存储由于存储的位数有限,绝对值大于存储范围的数在存储时将溢出;范围的数在存储时将溢出; 2由于有符号的数用补码存储,当存储的由于有符号的数用补码存储,当存储的补码改变到表示负数范围时将表示负数。补码改变到表示负数范围时将表示负数。/* EX2-2.C */main int a, b, c; unsigned u, v; a=32767+1;b=131071;c=-98304; u=131071;v=-98304; printfa=%d,b=%
33、d,c=%dn u=%u,v=%un,a,b,c,u,v;【例例2-2】整型数据的整型数据的溢出溢出5.实型数据的存储实型数据的存储 与整型数据的存储情况不同,为了扩大表示数与整型数据的存储情况不同,为了扩大表示数的范围,实型数据是按指数形式存储的。以微机中的范围,实型数据是按指数形式存储的。以微机中存储存储float型数据为例,型数据为例,float型数据在内存中占据型数据在内存中占据4个字节即个字节即32位二进制信息,分别存放符号位、规格位二进制信息,分别存放符号位、规格化的尾数、阶符位和阶码。化的尾数、阶符位和阶码。6.实型数据的舍入误差实型数据的舍入误差 我们知道,除了溢出以外,整数存
34、储是没有误我们知道,除了溢出以外,整数存储是没有误差的。然而,由于实型变量是用有限的存储单元存差的。然而,由于实型变量是用有限的存储单元存储较大范围的实数,提供的有效数字总是有限的,储较大范围的实数,提供的有效数字总是有限的,尾数在有效位以外的部分将被舍去,因此实型数据尾数在有效位以外的部分将被舍去,因此实型数据是有误差的。是有误差的。 1一个比较小的数与一个比较大的数求和,一个比较小的数与一个比较大的数求和,和的有效位数超过允许的范围,最后的结果是比较和的有效位数超过允许的范围,最后的结果是比较小的数没起作用,尽管它并不很小。小的数没起作用,尽管它并不很小。 24.0/3.0*3.0,按数学
35、常识结果应等于,按数学常识结果应等于4.0,然而由于舍入误差,其结果并不等于,然而由于舍入误差,其结果并不等于4.0。/* EX2-3.C */main float x, y; x=123456.789E5; y=x+30.0; printfx=%f, y=%fn, x, y;【例例2-3】实型数据的实型数据的舍入误差舍入误差7. 字符数据的存储与使用字符数据的存储与使用 字符类型数据的存储与整型数据的存储非常字符类型数据的存储与整型数据的存储非常相似,也分成有符号和无符号两种,只是用一个相似,也分成有符号和无符号两种,只是用一个字节字节8位二进制信息存储字符类型数据。位二进制信息存储字符类型
36、数据。 01000001c 0c12728-|c| -128a = = = = != 3.逻辑运算符逻辑运算符! & | 4.位运算符位运算符 | & 5.赋值类运算符赋值类运算符= 及及 自反赋值运算符自反赋值运算符 6.条件运算符条件运算符?:7.逗号运算符逗号运算符, 8.指针及求地址运算符指针及求地址运算符* &9.求存储单元字节数运算符求存储单元字节数运算符sizeof10.类型转换运算符类型转换运算符类型类型11.构造体成员运算符构造体成员运算符 -12.下标运算符下标运算符 13.其他运算符其他运算符 如函数调用运算符如函数调用运算符 等等 学习运算符要注意几个方面问题:学习运算
37、符要注意几个方面问题:1运算符的功能;运算符的功能;2运算符与操作对象的关系:运算符与操作对象的关系:操作数的个数操作数的个数单目、双目、三目单目、双目、三目;操作数的类型如求余运算符操作数的类型如求余运算符%要求操作数是整型要求操作数是整型;结合方向结合方向操作数到运算符操作数到运算符:左结合、右结合:左结合、右结合单单目、赋值类、条件运算符目、赋值类、条件运算符;3运算符的优先级;运算符的优先级;4运算结果的数据类型:不同类型数据运算将发生运算结果的数据类型:不同类型数据运算将发生类型转换类型转换2.3 运算符与表达式运算符与表达式2.3.1 算术运算符与算术表达式算术运算符与算术表达式C
38、语言中根本的算术运算符共有语言中根本的算术运算符共有5个,分别为:个,分别为:+加加, -减减, *乘乘, /除除,%取模,或取模,或称求余称求余1 双目运算符,结合方向均为从左到右。双目运算符,结合方向均为从左到右。2 %取模运算符仅用于整型变量或整型常取模运算符仅用于整型变量或整型常量的运算,量的运算,a%b结果为结果为a除以除以b的余数,的余数,余数的符号余数的符号与被除数一样与被除数一样,如:,如:7%3的值为的值为1;17%-3的结果为的结果为2;-19%4的结果为的结果为-3。2.3 运算符与表达式运算符与表达式2.3 运算符与表达式运算符与表达式3 +、-、*、/运算符的两个操作
39、数既可以是运算符的两个操作数既可以是整数,也可以是实数。整数,也可以是实数。4 /除法运算符,当对两个整型的数据除法运算符,当对两个整型的数据相除时结果为整数,如:相除时结果为整数,如:7/3,其值为,其值为2,舍去,舍去小数部分,相当于整除操作小数部分,相当于整除操作;当操作数中有一当操作数中有一个为负数时,整除结果取整为向个为负数时,整除结果取整为向0靠拢,靠拢, 如:如:-5/3=-1、5/2=2。根本算术表达式根本算术表达式: 由根本算术运算符、括号以由根本算术运算符、括号以及操作对象组成的符合及操作对象组成的符合C语言语法规那么的表语言语法规那么的表达式达式.2.3.1 算术运算符与
40、算术表达式算术运算符与算术表达式优先级:优先级:*、/、%同级较高,同级较高,+、-同级较低同级较低结合方向结合方向:当一个运算对象两侧的运算符的优先当一个运算对象两侧的运算符的优先级别不同时,应遵循优先级高的先处理的规那级别不同时,应遵循优先级高的先处理的规那么。当一个运算对象两侧的运算符的优先级别么。当一个运算对象两侧的运算符的优先级别一样时,应遵循运算符的结合方向。算术运算一样时,应遵循运算符的结合方向。算术运算符的结合方向是从左至右。符的结合方向是从左至右。 有时为了到达某种目的,需要将一个表达式有时为了到达某种目的,需要将一个表达式的类型转变成所需的类型,这时就要用到强迫类的类型转变
41、成所需的类型,这时就要用到强迫类型转换运算符。型转换运算符。作用形式:作用形式: 类型类型 表达式表达式将表达式的值转换成相应类型将表达式的值转换成相应类型例如:例如: doublea intx+y float5/3优先级:同所有单目运算符,优先级:同所有单目运算符,高于根本算术运高于根本算术运算符。算符。3.强迫类型转换强迫类型转换显式转换显式转换运算符运算符3.强迫类型转换强迫类型转换显式转换显式转换运算符运算符注意:注意: 表达式一定要加括号表达式一定要加括号因强迫类型转换是单目因强迫类型转换是单目运算,优先级高运算,优先级高,例如上面最后一个表达式中只,例如上面最后一个表达式中只是将是
42、将5转变成转变成float型,而不是将型,而不是将5/3转变成转变成float型。型。所以所以float5/2与与float5/2结果是不一样结果是不一样的的 假设对变量实型显式转换,将得到新类型的一假设对变量实型显式转换,将得到新类型的一个值,个值,原变量的类型及其存储值均不变原变量的类型及其存储值均不变。 /* EX2-7.C */main float x=3.6; printf%d, intx; printf%fn, x;【例例2-7】强迫类型转换强迫类型转换 由于求余取模运算只能针对整型数据,因由于求余取模运算只能针对整型数据,因此经常用强迫类型转换的方法将一个实型量变量此经常用强迫类
43、型转换的方法将一个实型量变量或常量变换成整型,然后才能进展取模运算,例或常量变换成整型,然后才能进展取模运算,例如:如:int5.5%3。4. 自增自减运算符:自增自减运算符:+和和- - 自增自减运算符自增自减运算符+和和-是是C语言中最常用也语言中最常用也最难掌握的两个单目运算符,具有最难掌握的两个单目运算符,具有右结合性右结合性。他。他们的作用是:们的作用是:只作用于变量,使变量的值自增只作用于变量,使变量的值自增1或自减或自减1。如。如+i相当于相当于i=i+1;-j相当于相当于j=j-1,因,因此此+、- -本质也有赋值作用。由于不能对常量或本质也有赋值作用。由于不能对常量或表达式赋
44、值,因此象表达式赋值,因此象3+, a+b- -等都是错误等都是错误的。的。4. 自增自减运算符:自增自减运算符:+和和- - +和和-运算符的前缀运算与后缀运算运算符的前缀运算与后缀运算 1前缀运算前缀运算+i:相当于:相当于i=i+1且表达式的值与且表达式的值与i的的值一样值一样先增值后引用先增值后引用;同样,;同样,-j相当于相当于j=j-1且表达式且表达式的值与的值与j的值一样。的值一样。 2后缀运算后缀运算i+:先取:先取i的值作为表达式的值,的值作为表达式的值,i再再自增自增1 先引用后增值先引用后增值;同样,;同样,j-:先取:先取j的值作为表达的值作为表达式的值,式的值,j再自
45、减再自减1 先引用后减值先引用后减值。例如:阅读下面程序,分析程序运行结果例如:阅读下面程序,分析程序运行结果mainint i=5,x,y,z;x=+i;y=i-;z=-i+;printf%d.%d,%d,%dn,x,y,z,i;运行结果为:运行结果为:6,6,-5,6 注意:由于注意:由于+和和是单目运算,优先级高于根本算术运算符,是单目运算,优先级高于根本算术运算符,同其他单目运算符。如表达式同其他单目运算符。如表达式-i+,由于,由于-和和+优先级一样,均为优先级一样,均为右结合性,故等同于右结合性,故等同于-i+有关自增自减运算符使用中的假设干问题有关自增自减运算符使用中的假设干问题
46、以下为以下为turbo c和和MSC中的规定中的规定1连续自增问题连续自增问题例如:例如:int i=3;i+i+ i+的值为的值为9,i的值为的值为6。运算时先。运算时先统一取值后逐步自增统一取值后逐步自增 int i=3; + i+ + i+ + i的值为的值为9,i的值为的值为6。运算。运算时先逐步自增后统一取值时先逐步自增后统一取值2连续自增作为连续自增作为printf函数输出项问题与上面函数输出项问题与上面1不同不同 int i=3;printfi+i+ i+输出输出12,逐步取值和自,逐步取值和自增增 int i=3;printf + i+ + i+ + i输出输出15,逐步自增和
47、,逐步自增和取值取值3printf函数中多输出项问题。函数中多输出项问题。 在多数系统中对函数参数的求值顺序是自右而左在多数系统中对函数参数的求值顺序是自右而左所以:所以:int i=3;printf“%d,%d,i+2,i+输出输出6,3说明:说明:C的运算符丰富、复杂,以上的运算符丰富、复杂,以上3中情况不提倡使用中情况不提倡使用/* EX2-8.C */main int i=5,j; j=+i+i+; printfi=%d,j=%dn,i,j; i=5; j=+i+i+i+; printfi=%d,j=%dn,i,j; printf%d %dn,i+j,j+; 【例例2-8】输出下面程序
48、中输出下面程序中i i、j j的值的值注意:注意:C中有的运算符作为一个字符,有的运算符有两个字符组成,在表达式中有的运算符作为一个字符,有的运算符有两个字符组成,在表达式中容易混淆,如:表达式中容易混淆,如:表达式i+j,这样的表达式容易引起歧义,最好防止使用。,这样的表达式容易引起歧义,最好防止使用。自增自减运算符常用于循环语句中自增自减运算符常用于循环语句中2.3.2 赋值运算符与赋值表达式赋值运算符与赋值表达式 1.赋值运算符赋值运算符 C语言中赋值运算符为语言中赋值运算符为“=,它的作用的一般,它的作用的一般形式为:形式为: 变量变量=表达式表达式 即将即将“=右边的表达式的值赋给其
49、左边的变量右边的表达式的值赋给其左边的变量。如:。如: a=5; /* 表示把一个常量表示把一个常量5赋给变量赋给变量a */ x=a+5; /* 表示将表达式表示将表达式a+5的值赋给变量的值赋给变量x */ 假如赋值运算符两侧的类型不一致,在赋值时要假如赋值运算符两侧的类型不一致,在赋值时要将表达式将表达式值的类型值的类型转换成变量的类型,然后再赋给转换成变量的类型,然后再赋给变量变量 几点说明:几点说明:1“=是赋值运算符,不是等于号等于号是是赋值运算符,不是等于号等于号是=。2赋值运算方向为自右向左。赋值运算方向为自右向左。3赋值运算的过程:先计算表达式,然后将计算结果转换赋值运算的过
50、程:先计算表达式,然后将计算结果转换成变量的类型后存到变量的存储单元中,该变量原有的值被覆盖成变量的类型后存到变量的存储单元中,该变量原有的值被覆盖。4赋值运算符左边只能是变量,不能是常量或表达式,如赋值运算符左边只能是变量,不能是常量或表达式,如2=a和和a+b=c都是错误的。都是错误的。5赋值运算符的优先级较低只高于逗号运算符,因此赋值运算符的优先级较低只高于逗号运算符,因此一般情况下表达式无须加括号,如一般情况下表达式无须加括号,如a=2+7/3将值将值4赋给变量赋给变量a。6赋值运算是一个表达式,赋值运算是一个表达式,其值即赋值后变量的值其值即赋值后变量的值,该值,该值可赋给其它变量可
51、赋给其它变量 。如。如b=a=9,赋值后,赋值后b的值为的值为9;x=y=z=10赋值后赋值后x、y、z的值均为的值均为10;2.3.2 赋值运算符与赋值表达式赋值运算符与赋值表达式 C语言允许在赋值运算符语言允许在赋值运算符“=之前加上其他运之前加上其他运算符以构成算符以构成复合的赋值运算符复合的赋值运算符。 根本算术运算符和位运算符。有:根本算术运算符和位运算符。有:+=,-=,*=,/=,%=,=,&=,=,|= 2. 复合赋值运算符复合赋值运算符a+=5 等价于等价于a=a+5 c-=d 等价于等价于c=c-da*=b+5 等价于等价于 a=a*b+5 g/=h-f 等价于等价于 g=
52、g/h-fa%=5 等价于等价于 a=a%5 复合赋值运算符与赋值运算符一致,处了比逗号运算符的优复合赋值运算符与赋值运算符一致,处了比逗号运算符的优先级高以外,比其他运算符的优先级都低先级高以外,比其他运算符的优先级都低3. 赋值类运算符的副作用及限制赋值类运算符的副作用及限制 1费解,易于误解。费解,易于误解。2不定解:因机器不同得到不同的结果。不定解:因机器不同得到不同的结果。 3注意:对赋值类运算符,交换律不成立注意:对赋值类运算符,交换律不成立c=b*=a+2; j=3; i=k=j+1+j=5; 假设先算后面括号,假设先算后面括号,结果为结果为i=11;假设先算前面括号,结果为假设
53、先算前面括号,结果为i=9; i=j=5+k=j+1; 4. 算术表达式的计算算术表达式的计算 优先级优先级类型类型运算符运算符结合性结合性1构造类构造类 2单目单目+、-、+、-、sizeof 3双目双目*、/、%4双目双目+、-5赋值类赋值类=、+=、-=、*= 、 /= 、 %=1.圆括号优先级最高,有多层圆括号从内向外运算圆括号优先级最高,有多层圆括号从内向外运算2.类型名类型名表达式表达式为强迫类型转换运算;为强迫类型转换运算;3.先按运算符的优先级由高到低进展,如先按运算符的优先级由高到低进展,如5*-2相当相当于于5*-2,结果为,结果为-10;同级的运算符按结合方向;同级的运算
54、符按结合方向进展进展 例:设有变量声明例:设有变量声明float a=3.0; int b=2; 计算表达式计算表达式: 2+sqrt1.0+a*b+/2解:解: 2+sqrt1.0+a*b+/22+sqrt4.0*b+/22+2.0*2/22+4.0/22+2.04.0 即表达式的值为即表达式的值为4.0,同时,同时b的值变为的值变为3,a的的值不变。值不变。 4. 算术表达式的计算算术表达式的计算 2.3.3 逗号运算符与逗号表达式逗号运算符与逗号表达式1.逗号运算符逗号运算符 , ,用逗号运算符可以将两个表达式连接起来。如:用逗号运算符可以将两个表达式连接起来。如: 2+3,2+52.逗
55、号表达式逗号表达式 用逗号运算符连接两个或两个以上表达式所形用逗号运算符连接两个或两个以上表达式所形成的新表达式就是逗号表达式,其一般形式为:成的新表达式就是逗号表达式,其一般形式为:表达式表达式1,表达式表达式2 , 表达式表达式n 求值过程:求值过程:先求表达式先求表达式1的值,再求表达式的值,再求表达式2的值的值,,最后求表达式最后求表达式n的值。的值。表达式表达式n的值就是整个逗的值就是整个逗号表达式的值。号表达式的值。 一个逗号表达式可以与另一个表达一个逗号表达式可以与另一个表达式构成一个新的逗号表达式。例如:式构成一个新的逗号表达式。例如: a=2+3,a*5,a+10 优先级优先
56、级: 逗号运算符是所有运算符中级别逗号运算符是所有运算符中级别最最低低的的.结合性结合性:逗号表达式的结合性为自左向逗号表达式的结合性为自左向右的。右的。 2.3.3 逗号运算符与逗号表达式逗号运算符与逗号表达式/* EX2-12.C */main int y=3,x=3,z=1; printf%d %dn,+x,y+,z+2; 【例例2-9】分析下面程序的运行结果分析下面程序的运行结果2.4 数据类型转换数据类型转换2.4.1类型转换概述类型转换概述 三种方式:三种方式: 类型自动转换、赋值类型转换和强迫类型转换类型自动转换、赋值类型转换和强迫类型转换 1.不同数据类型的差异不同数据类型的差
57、异 数据类型的差异表达在存储数据的范围和精度,存储数据的范数据类型的差异表达在存储数据的范围和精度,存储数据的范围越大、精度越高,该类型越高级。围越大、精度越高,该类型越高级。1floatdouble2char,short,int,longfloat,double 3charshortintlong4signedunsignedC语言提供了丰富的数据类型,不同类型数据的存储长度和存储方式不同,语言提供了丰富的数据类型,不同类型数据的存储长度和存储方式不同,一般不能直接进展运算,为了进步编程效率,一般不能直接进展运算,为了进步编程效率,C语言允许不同数据类型互语言允许不同数据类型互相转换。相转换
58、。2.数据类型转换产生的数据类型转换产生的6种效果种效果1数据类型提升与降格数据类型提升与降格2为保持数值不变,整型短数据转换成整型长数据为保持数值不变,整型短数据转换成整型长数据时将产生符号位扩展与零扩展。时将产生符号位扩展与零扩展。3最高位失去符号位功能最高位失去符号位功能signed型转换成型转换成unsigned型型与变成符号位与变成符号位unsigned型转换成型转换成signed型型:长度不变,数值可能改变:长度不变,数值可能改变4丧失精度丧失精度5截去高位截去高位溢出溢出产生数值的变化:发生在长的产生数值的变化:发生在长的整型数据转换成较短类型的整型数据时。整型数据转换成较短类型
59、的整型数据时。6给实数赋值,给实数赋值,float型只能承受型只能承受7位有效数字,位有效数字,double型只能承受型只能承受16位有效数字,多给无效。位有效数字,多给无效。2.4 数据类型转换数据类型转换系统自动按运算顺序将低级的数据直接转换成高级系统自动按运算顺序将低级的数据直接转换成高级的数据,以保证运算的精度,详细规那么为:的数据,以保证运算的精度,详细规那么为:1 float 在运算时自动转换成在运算时自动转换成double;2 char和和short在运算时自动转换成整型数据在运算时自动转换成整型数据int;3 int和和unsigned混合运算时,将整型数据转混合运算时,将整型
60、数据转换成无符号整型数据,即是用补码参加运算,不会换成无符号整型数据,即是用补码参加运算,不会影响结果的正确性;影响结果的正确性;4 int或或unsigned与与long混合运算时,都转换混合运算时,都转换成成long型。型。5 int、unsigned、long与浮点型数据混合运与浮点型数据混合运算时,都转换成浮点型数据算时,都转换成浮点型数据double。2.4.2 自动类型转换自动类型转换 高高doublefloatlongchar,shortunsigned低自动类型转换规那么int2.4.2 自动类型转换自动类型转换2.4.3 赋值类型转换赋值类型转换 赋值运算时,假如赋值运算符两
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于项目启动前的风险评估确认函(5篇)范文
- 企业文档管理体系建设与实施操作手册
- 市场扩展策略研讨邀请函(7篇)范文
- 2026工业互联网平台标准化建设与生态合作战略研究
- 2026年供应链数字化高级专家招聘笔试试卷 招录14人内部题库
- 更改会议时间地点的确认函7篇
- 福建晋江 2026 民营经济岗公务员招录考试试卷 招聘 11 人
- 2026 年外资锂电池设备企业广东深圳国内现场工程师笔试试卷 招录 40 人
- 2026装备制造业智能化升级策略研究及供应链整合方案与提高效率规划指南
- 机场管理团队绩效评估表
- 2026年高邮市消防系统事业单位公开招聘工作人员3人笔试备考题库及答案解析
- 2026年高校辅导员经典面试题(含答案)
- 《勤洗生活衣物》教学设计-2026-2027学年滇教版初中劳动技术七年级上册
- 2026年江苏省徐州市中考英语真题(含答案)
- AQ3035-2010危险化学品重大危险源安全监控技术规范关键条款解读
- T∕CHCIA 013-2023 液体香氛规范
- 2025版《广东省护理病历书写管理规范(试行)》
- 银行对公营销培训课件
- 冬季安全生产综合注意事项(防冻、防滑、防火、防爆、防中毒)课件
- 中小学教学质量考核奖励办法(2026年修订)
- ISO14644-5-2025洁净室及相关受控环境-第5部分运行中文版
评论
0/150
提交评论