C语言程序设计第3章_第1页
C语言程序设计第3章_第2页
C语言程序设计第3章_第3页
C语言程序设计第3章_第4页
C语言程序设计第3章_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、第第3章章 数据类型、运算符与表达式数据类型、运算符与表达式 为了方便地表示这些不同种类的数据,C语言提供了丰富的数据类型(参见P37)。 在实际问题中,可能会遇到各种各样的数据。年龄:22工资:2381.85姓名: Hussein Sadam这些数据都以某种特定的形式存在着。整数 实数字符串C的数据类型的数据类型数据类型 C语言要求,必须为出现在程序中的所有数据指定数据类型。 由于 C语言把程序中的数据又分为变量变量和常量常量两大类,因此,不论是常量数据还是变量数据,都要指定数据类型。 空类型指针类型共用体结构体数组构造类型枚举型双精度型单精度型实型(浮点型)字符型短整型长整型基本整型整型基

2、本类型C语言根据什么把数据分为变量和常量? 3.2 常量与变量 在程序执行过程中,其值可以改变的量称为变量变量。在程序执行过程中,其值不能被改变的量称为常量常量。整型常量 :98,-3实型常量:3.14,0.8字符常量: a,B由于通过字面就能判别它们是常量,因此,这样表示的常量称为字面常量字面常量 /直直接常量接常量, 除了字面常量外,还可以用符号来代表一个常量,该符号称为符号常量符号常量。符号常量 如果在程序中某处定义了符号常量PI ,从此往后,本程序中凡是出现PI的地方都代表3.14,而且PI可以和常量3.14一样参加运算。 #define PI 3.14 符号常量的定义方式为:#def

3、ine 符号名符号名 常量值常量值#define PI 3.14#define ROOM_NUMBER 301#define NAME “Johnson” 符号常量符号常量符号常量符号常量符号常量符号常量符号常量符号常量再来看P38例3.1。 在程序中,适当使用符号常量有什么好处呢?能起到能起到“见名知意见名知意”的作用,比直接写个常量直观。的作用,比直接写个常量直观。能做到能做到“一改全改一改全改”。 关于符号常量需要注意:习惯上,符号常量名用大写;习惯上,符号常量名用大写;符号常量是常量不是变量,不允许用赋值运算等改变它的符号常量是常量不是变量,不允许用赋值运算等改变它的值。值。变 量 每

4、个计算机上都有内存,程序只有装入到内存中,才可能被执行。 从逻辑上看,内存是由一个一个的字节构成的;内存201202203204205206207内存地址 每个字节都有唯一的内存地址。 每个字节可以容纳8位二进制数。二进制位变 量 所谓变量,就是在程序执行过程中,其值可以被改变的量。通俗地讲,变量就像某高档饭店的房间,这体现在以下几个方面: 对某个房间来说,一拨客人走后,另一拨客人可以进来,虽然房间不变,但里头吃饭的人在变。 在C程序中,变量就是建立在内存里的房间,它用来存储不断变化的信息。存放在变量中的信息称为变量值变量值。 为了区分不同的房间,人们为每个房间起一个名字,比如百合厅、玫瑰厅等

5、。 每个变量也有变量名。 房间有大小、档次之分。 变量有类型之分,变量的数据类型决定了可以容纳的信息种类,也决定了所占存储单元的大小。 每个房间有自己的房间号,而且房间名与房间号有对应关系。 每个变量有自己的存储地址,而且变量名与存储地址有对应关系。 总之,变量具有名字、类型、值、地址等属性。变 量下面结合例子来理解变量的这些属性。 #include void main() int a; a=10; a=50; a=a*2; printf(”a=%dn”,a); 在C程序中,变量都是先定义、后使用的。 定义变量的格式为:数据类型数据类型 变量名;变量名; 对于程序中定义的每个变量,TC会根据变

6、量的数据类型,为它分配一定大小的存储单元。 与此同时,也在变量名与变量内存地址之间建立了对应关系。 该赋值语句会把10存放到变量a中,于是a的值变为了10。 具体地说是这样进行的,首先通过变量名找到相应的内存地址,再把数据写入相应的存储单元里。标识符 在C语言中,变量名、符号常量名、函数名等统称为标识符标识符。C语言规定,标识符只能由字母、数字和下划线组成,且第一个字符只能是字母或下划线。 下列是合法的标识符,可以充当变量名等。sum,student_name,_part_1 下面这些标识符不合法,Mr.Wang,ab,1_2_3 大小写敏感,sum,Sum,SUM是3个不同的标识符。关键字不

7、能作为标识符。ANSI C标准未规定标识符的最大长度,TC最多允许32个字符。应尽量做到“见名知意”。标识符应注意问题标识符应注意问题3.3 整型数据 下面来学习整型数据在C程序中的表示方法。 先来复习一下数制和数制之间的转换。平时我们遇到的整数都是十进制形式的,在计算机科学中,还会用到二进制、八进制以及十六进制表示的整数。 数制数制特特 点点转换为十进制转换为十进制十进制十进制每个数位只可能是每个数位只可能是09,而且逢而且逢10进进1。123=1*102+2*101+3*100八进制八进制每个数位只可能是每个数位只可能是07,而且逢而且逢8进进1。(123)8=1*82+2*81+3*80

8、 =83十六进制十六进制每个数位只可能是每个数位只可能是09、af,而且逢,而且逢16进进1。(123)16=1*162+2*161+3*160 =291二进制二进制每个数位只可能是每个数位只可能是0、1,而且逢而且逢2进进1。(1101)2=1*23+1*22+0*21+1*20 =13数制转换如果想把十进制转换为其他进制,该怎么办呢?1十进制转换为二进制由二进制转换为八进制,只需要从二进制数的最低位起,每3位一组依次划分,并写出每组二进制所表示的数字即可。 65=(1000001)2=(101)8由二进制转换为十六进制,只需要从二进制数的最低位起,每4位一组依次划分,并写出每组二进制所表示

9、的数字即可。65=(1000001)2=(41)16这里采用除基取余法。 65=(1000001)22二进制转换为八进制3二进制转换为十六进制整型常量 由于C语言把数据分为常量和变量两大类,所以整型数据也相应地分为整型常量和整型变量。1整型常量的表示方法整型常量的表示方法 整型常量可以以三种形式出现在C程序中。(2)八进制形式 为了避免与十进制形式混淆,这种形式要求以0开头。如0123表示八进制数123,即(123)8,其值为182+281+380,等于十进制的83。(1)十进制形式 例如 123,5,0(3)十六进制形式 这种形式要求以0 x开头。如0 x123表示十六进制数123,即(12

10、3)16,其值为1162+2161+3160,等于十进制的291。整型变量 我们可以用int 变量名变量名;来定义整型变量。例如int i; 此时,我们可以用赋值语句把整型数据存放到变量i中,例如,用i=10;可以把10存放到变量i中,也就是把10存放到变量i的2字节的存储单元中。 在变量中有值以后,我们可以用%d格式符来输出整型变量值,例如, printf(”%d”,i);会输出10内存201202203204205206207 TC系统会在内存中为它分配2字节的存储单元,共计16个二进制位。i10整型数据10在存储单元中是如何存放的呢? 整型数据的存储 整型数据在存储单元中是如何存放的呢?

11、换句话说,如何用16位二进制数来表示整型数据呢?这分两种情况: 1若数据0,数据直接以其二进制形式存放。 内存201202203204205206207i 由于10的二进制形式是1010,所以10的存放情况如图所示。1100 0 0000110 00 0 00 0 如果把两个字节画在同一行上 ,就得到(P41图3-2b)。 0 0 0 00 00000 0 0 00整型数据的存储2若数据0,数据以其补码形式存放。 内存201202203204205206207i 由于-10的补码1111111111110110,所以-10的存放情况如图所示。 11 1 1110011 11 1 11 1 如果

12、把两个字节画在同一行上 ,就得到(P41图3-3)。求负数的补码的方法是:将负数的绝对值的二进制形式按位取反再加1。 011 1 1 11 11011 1 1 11整型数据的存储011 1 1 11 1111 1 1 110110 0 0 00 00000 0 0 00 大家注意一个现象,在10的存储表示中,其最左面的一位为0;在10的存储表示中, 其最左面的一位为1。通过以上分析,我们得到10的存储表示为:10的表示为: 实际上,在整数的16位中,最左面的一位是表示符号的,也称为符符号位号位。该位为0,表示数据为正;该位为1,表示数据为负。这样一来,一个int型变量值最大为 111 1 1

13、11 1111 1 1 101即为2151=32767 类似地,一个int型变量值最小为 000 0 0 00 00000 0 0 01即为215=32768 符号位符号位整型变量的分类 因此,一个因此,一个int型变量值的范围为型变量值的范围为 3276832767也就是说,一个也就是说,一个int型变量仅能存放这个范围之间的整数。型变量仅能存放这个范围之间的整数。 但是在有些场合,这个范围显得过小,无法表示某些整型数据,如全国人口变化情况。另外,在有些情况下,这个范围又显得过大,造成内存的浪费,如温度。于是,C语言对整型变量作了进一步的分类,细分为三种:基本整型:基本整型:该类型以该类型以

14、 int 表示。表示。 int sum; /*定义定义int类型变量类型变量*/短整型:短整型:该类型该类型以以 short int 或或 short 表示。表示。 short temperature; 长整型:长整型:该类型该类型以以 long int 或或 long 表示。表示。 long increment; ANSI C标准虽然未具体规定各类整型变量的存储单元的大小,但要求 长整型长整型的存储单元基本整型基本整型的存储单元,基本整型,基本整型的存储单元短整型短整型的存储单元。 显然,存储单元越大,取值范围越广。无符号整型变量 在有些应用场合,所涉及的整数均为正整数,如学号、年龄、人口数

15、等。在这种情况下,可以使用无符号整型变量。无符号整型变量共有三种类型:无符号基本整型:无符号基本整型:以以 unsigned int 或或 unsigned 表示。表示。 unsigned sum; /*定义定义unsigned类型变量类型变量*/无符号短整型:无符号短整型:以以 unsigned short int 或或 unsigned short 表示。表示。 unsigned short age;无符号长整型:无符号长整型:以以 unsigned long int 或或 unsigned long 表示。表示。 unsigned long population; 容易看出,对前三种类型

16、添加unsigned修饰符,就得到了无符号整型无符号整型的表示。相应地,前三种类型被称为有符号整型有符号整型。无符号整型变量和有符号整型变量的区别 有符号整型变量的存储单元中最左一位代表符号(0为正,1为负)无符号整型变量只能表示非负整数。我们以如下定义的变量a、b来说明区别。 unsigned int a; int b;符号位 无符号整型变量的存储单元中所有二进制位都用来存放数据本身,并无符号位。1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0最大值:216-1=65535最小值:01 0 0 0 0 0 0 0 0

17、 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1最大值:215-1=32767最小值:-216=-32768 一般地说,无符号整型变量所能表示的最大值比有符号整型变量所能表示的最大值扩大一倍。ab有符号整型变量正负均可。a的数值范围为065535b的数值范围为3276832767整型变量总结下面列出了可以定义和使用的六种整型变量。无符号基本整型:无符号基本整型:unsigned int 或或 unsigned 无符号短整型:无符号短整型: unsigned short int 或或 unsigned short 无符号长整型:无符号长整型: unsig

18、ned long int 或或 unsigned long 基本整型:基本整型:int 短整型:短整型: short int 或或 short 长整型:长整型: long int 或或 long 有符号整型有符号整型 虽然ANSI C并未统一规定各类整型变量的存储单元所占字节数,但每个C系统都有自己的明确规定。 Turbo C系统的规定见P43表3-1。 整型常量的类型 C语言规定,程序中的所有数据,不论是常量还是变量,都要为其指定数据类型,下面我们来看一下整型常量的类型(以TC为例)。(1)其值在)其值在3276832767区间内的整型常量被认为是区间内的整型常量被认为是 int 型的,可型

19、的,可以把它赋值给以把它赋值给 int 型或型或 long int 型变量。型变量。(2)其值在)其值在3276832767区间外但在区间外但在2312311区间内区间内的整型常的整型常量被认为是量被认为是 long int 型的,可以把它赋值给型的,可以把它赋值给 long int 型变量。型变量。(3)一个非负整数后面加一个字母)一个非负整数后面加一个字母u/U,被认为是无符号型的,在内,被认为是无符号型的,在内存中按无符号方式存放。例如,存中按无符号方式存放。例如,12345u。(4)一个整数后面加一个字母)一个整数后面加一个字母l/ L,被认为是,被认为是long int型的。型的。

20、例如,例如,123L、0L、-1L。 3.4 实型数据 在介绍实型数据之前,我们先来了解一下关于有效数字的相关概念。 一个数的一个数的有效数字有效数字是指从该数最左边不为是指从该数最左边不为0的数字位起最右边的数字位起最右边不为不为0的数字位止之间的每一个数字位,而这些数字位的个数称为该的数字位止之间的每一个数字位,而这些数字位的个数称为该数的数的有效数字位数有效数字位数。 数数 值值有效数字有效数字有效数字位数有效数字位数35003,522.7052,7,0,540.2782,7,8363.006,320.001041,0,43 另外,若一个数带另外,若一个数带有指数部分,它不影响有指数部分

21、,它不影响该数的有效数字位数。该数的有效数字位数。 3.143,1,433141053,1,433.141063,1,43实型常量的表示方法实型常量可以以两种形式出现在C程序中:(2 2)指数形式)指数形式 例如,例如,-123.4e3, 1.82E-3, -0.0073e+5(1 1)十进制小数形式)十进制小数形式 例如,例如,123.4,123.,-.123,0.0一定要有小数点,否一定要有小数点,否则就不是实型常量。则就不是实型常量。注意:注意:在在e的前后一定要有数字,的前后一定要有数字,e2、1E 不合法不合法。-123.41031.8210-3-0.0073105在在e的后面务必是

22、整数,的后面务必是整数, 1.3E3.5 不合法不合法。一个实数可以用多种指数形式表示出来。一个实数可以用多种指数形式表示出来。 123.45可表示为可表示为1234.5e-1,123.45e0,1.2345e2,0.12345e3 规范化的指数形式规范化的指数形式 在在e前的部分中,小数点前有前的部分中,小数点前有且仅有一位数字,而且是非且仅有一位数字,而且是非0数字数字 实型变量 我们可以用float 变量名变量名;来定义实型变量。例如float a; 此时,我们可以用赋值语句把实型数据存放到变量a中,例如,用a=123.456;可以把123.456存放到变量a中,也就是把123.456存

23、放到变量a的4字节的存储单元中。 我们可以用格式符%f按小数形式小数形式或%e按规范规范化的指数形式化的指数形式来输出实型变量值,例如, printf(”%f”,a); printf(”%e”,a);会输出123.456000 会输出1.23456e+02内存201202203204205206207 TC系统会在内存中为它分配4字节的存储单元,共计32个二进制位。123.456实型数据在存储单元中是如何存放的呢? a实型数据的存储 同在整型变量的讨论中一样,我们来看一下实型数据在32位的存储单元中是如何存放的? 实际上,32位存储单元被分为如下的3大部分。每个实型数据在存储时,是按指数形式存

24、放的。小数部分小数部分指数部分指数部分符符号号位位ANSI C标准并没有规定每一部分各占多少二进制位,显然,在总位数一定的前提下,小数部分占的位数越多,则可表示数的更多有效数字位,数值的范围就越小;反之,指数部分占的位数越多,则数值的范围就越大,可表示的有效数字位就更少。实型变量的分类为了适应不同的应用场合,C语言又把实型变量进一步的分类为 :单精度型:单精度型:以以 float 表示。表示。 float x; /*定义定义float型变量型变量*/长双精度型:长双精度型:以以 long double 表示。表示。 long double z;双精度型:双精度型:以以 double 表示。表示

25、。 double x; 由表可以看出,float型变量的有效数字位数为67,这意味着float型变量最多只保证接收7位有效数字。因此,若定义 float a; a=123456.789;那么,由于float型只能接收7位有效数字,所以最后两位将被舍去,这样就会造成舍入误差舍入误差。 Turbo C关于各类实型变量的规定,请参见关于各类实型变量的规定,请参见P46表表3-2。实型常量的类型一般情况下,实型常量被认为是双精度型的。一般情况下,实型常量被认为是双精度型的。 一个实型常量既可以赋给一个实型常量既可以赋给float变量,也可以赋给变量,也可以赋给double变量,变量,只是接收的有效数字

26、位数不同而已。只是接收的有效数字位数不同而已。 float a; a=1.23*0.456; 系统会把1.23和0.456作为双精度数据存储和运算,得到一个双精度的乘积,然后取前7位有效数字赋给变量a。这样做的好处是提高了精度,但也降低了运算速度。 如果希望如果希望C系统把某实型常量按单精度处理,只要在该数据后面加上系统把某实型常量按单精度处理,只要在该数据后面加上f或或F即可。例如,即可。例如,1.23f -10.836F。float a; double b; a=123456.789; /*接收接收7位位*/b=123456.789; /*9位全接收位全接收*/3.5 字符型数据 P364

27、附录附录I给出了在程序中可以使用的字符,每个字符都有给出了在程序中可以使用的字符,每个字符都有一个编码,称为一个编码,称为ASCII码。例如,码。例如,大写字母大写字母AZ的的ASCII码为码为6590小写字母小写字母az的的ASCII码为码为97122数字数字 09的的ASCII码为码为4857 规律总结:规律总结:相邻字母或数字的相邻字母或数字的ASCII码差码差1 对应对应大小写字母的大小写字母的ASCII码差码差32 转义字符 像字母、数字等字符我们可以直接从键盘上输入,但是有许多控制字符无法直接从键盘上输入。 实际上,我们可以用转义字符形式表示任意字符,方法有二:八进制:八进制:格式

28、为ddd,把要表示字符的ASCII码的八进制形式放在后即可, 例如,101代表ASCII码为65=(101)8的A。十六进制十六进制: 格式为xhh,把要表示字符的ASCII码的十六进制形式放在x后即可,例如,x41代表ASCII码为65=(41)16的A。 C语言用以 开头的字符序列来表示这些字符,例如, 用n表示“换行符”(ASCII码为10), 用b表示“退格符”(ASCII码为8)。这种形式的字符称为“转义字符转义字符”,意思是把反斜杠后面的字符转换为别的意义。如n中的n不代表字母n,而代表“换行符”。 常见的转义字符如常见的转义字符如P48表表3-3所示。所示。 字符常量需要注意的是

29、,需要注意的是,n要想表示值为要想表示值为 的字符常量,不能写为的字符常量,不能写为 ,而应写作,而应写作 。n要想表示值为要想表示值为 的字符常量,不能写为的字符常量,不能写为 ,而应写作,而应写作 。字符常量是用单撇号括起来的单个字符,例如,字符常量是用单撇号括起来的单个字符,例如, a , D , , n , 101字符变量 字符变量可以用来存放字符常量,字符变量可以用来存放字符常量, 它只它只能放一个字符。能放一个字符。 我们可以用我们可以用char 变量名变量名;来定义字符变量。例如来定义字符变量。例如char ab; 我们可以用赋值语句把字符常量存放到字符我们可以用赋值语句把字符常

30、量存放到字符变量中,例如,变量中,例如,ab=A;可把字符可把字符A存放到变量存放到变量ab中。需要特别注意的是,中。需要特别注意的是,存储单元中实际存放的是字符存储单元中实际存放的是字符A的的ASCII码码65,且,且以二进制形式。以二进制形式。 内存201202203204205206207 TC系统会在内存中为每个字符变量分配系统会在内存中为每个字符变量分配1字字节的存储单元节的存储单元 。6500010100ab 显然,这种存放形式十分类似于整数显然,这种存放形式十分类似于整数65的存放的存放形式。形式。字符数据与整型数据可以通用 由于字符数据在内存中以ASCII码存放,而且其存储形式

31、和整数的存储形式类似,所以C语言中字符数据与整型数据之间可以通用。这体现在三方面: 1.字符数据可以参加算术运算字符数据可以参加算术运算例如,例如,100-A,该表达式的值为,该表达式的值为100-65=35。 2.可以把整数赋值给字符变量可以把整数赋值给字符变量例如,例如,ab=66;3.字符数据既能按字符形式输出,也能按整数形式输出。字符数据既能按字符形式输出,也能按整数形式输出。01000010ab当以当以整数形式整数形式输出时,直接将输出时,直接将ASCII码作为整数输出。可用码作为整数输出。可用 printf(%d,ab);来实现。来实现。当以当以字符形式字符形式输出时,系统输出的是

32、存储单元中的输出时,系统输出的是存储单元中的ASCII码码所对应的字符。可用所对应的字符。可用 %c 格式符来实现。格式符来实现。 printf(%c,ab); 字符变量举例#include void main()char ab;ab=A;printf(%c,ab);printf(%d,ab);ab=ab+32;printf(%c,ab);printf(%d,ab);字符串常量 C语言除了允许使用字符常量外,还允许使用字符串常量。例如,语言除了允许使用字符常量外,还允许使用字符串常量。例如, ”CHINA”就是一个字符串常量。就是一个字符串常量。 字符串常量就是用双撇号括起来的字符序列。字符串

33、常量就是用双撇号括起来的字符序列。 我们可以用我们可以用 printf(”CHINA”);或或 printf(”%s”,”CHINA”);来输出字符串。来输出字符串。 字符常量和字符串常量比较 形式上,字符常量是单个字符用单撇号括起来,如形式上,字符常量是单个字符用单撇号括起来,如A,0;字符串常量是若干个字符用双撇号括起来,如字符串常量是若干个字符用双撇号括起来,如”USA”,”A”,”。存储上,为保存每个字符常量只需存储上,为保存每个字符常量只需1字节的内存;字节的内存; 系系统为了保存字符串常量,除了要为字符串中的每个字符统为了保存字符串常量,除了要为字符串中的每个字符分配一个字节外,还

34、要多分配一个字节用来存放分配一个字节外,还要多分配一个字节用来存放”字符字符串结束符串结束符”即即0。 例如,为了保存例如,为了保存“CHINA” ,需要,需要6个字节的内存。个字节的内存。30167302723037330478305653060 设置设置“字符串结束符字符串结束符”便于函数判断字符串是否结便于函数判断字符串是否结束。例如,在用束。例如,在用 printf(“CHINA”);输出时,是一个字符一个字符的输出,直到遇到输出时,是一个字符一个字符的输出,直到遇到0为止。为止。 NIHCA字符常量和字符串常量比较 字符变量可以保存字符常量的值,例如,字符变量可以保存字符常量的值,例

35、如, char c; c=A;但是,字符变量不能用来保存字符串常量,例如,但是,字符变量不能用来保存字符串常量,例如, c=”A”; 是非法的,字符串常量可以保存在字符数组中。是非法的,字符串常量可以保存在字符数组中。 如果字符串中想包含如果字符串中想包含”,不能写为,不能写为”abc”de”,应写,应写为为”abc”de”。但但”Im” 是合法的字符串。是合法的字符串。 3.6 变量赋初值 我们可以同时对多个变量进行初始化,例如,我们可以同时对多个变量进行初始化,例如, int a=3, b, c=20; int a=3,b=3,c=3;但是,第二个式子不能写成:但是,第二个式子不能写成:

36、int a=b=c=3; C语言允许在定义变量的同时,为变量设置初值,称为变量的初始变量的初始化化。例如,int i=3; /*定义定义i为整型变量,初值为为整型变量,初值为3*/float f=3.14;char c=P;等价于:等价于: int i; i=3;3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 我们知道, 整型数据可以细分为short、int、long,实型数据可以细分为float、double,并且知道字符数据与整型数据之间可以通用。 高高doublefloatlongunsigned低低intshort、char 在实际应用中,可能需要将这些不同类型的数据进行

37、混合运算。在进行混合在实际应用中,可能需要将这些不同类型的数据进行混合运算。在进行混合运算时,运算时,C系统会按照一定的规则,系统会按照一定的规则,自动地自动地将操作数转换成同一类型,然后再进将操作数转换成同一类型,然后再进行运算。行运算。 转换原则分为两部分,如下图所示(转换原则分为两部分,如下图所示(P54图图3-10),),务必要做的务必要做的转换转换 务必要做的务必要做的转换转换 float型一律转化为型一律转化为double型,型,即使是两个即使是两个float型数据运算。型数据运算。 char型、型、short型一律转化为型一律转化为int型型 。 根据操作数的类型根据操作数的类型

38、进行转换,级别低进行转换,级别低的向级别高的转换的向级别高的转换注意:上述类型转换是由系注意:上述类型转换是由系统自动进行的。统自动进行的。3.8 算术运算符和算术表达式算术运算符和算术表达式运算符丰富是C语言的特点之一,P365附录III详细描述了C中的所有运算符,我们可以从多个角度对运算符进行分类。按按功功能能算术运算符算术运算符+*/%关系运算符关系运算符=!=逻辑运算符逻辑运算符!&| 按所需操作数的个数划分为:按所需操作数的个数划分为:n双目运算符双目运算符:需要两个操作数的运算符,如:需要两个操作数的运算符,如+,。n单目运算符单目运算符:()(),。n三目运算符三目运算符:条件运

39、算符:条件运算符?:?:是唯一需要是唯一需要3个操作数的运算符。个操作数的运算符。基本算术运算符 基本算术运算符包括基本算术运算符包括 +、-、*、/、%,其中,其中,+:称为加法运算符,或正值运算符,如称为加法运算符,或正值运算符,如3+5, +8 关于基本算术运算符,请注意以下几点:关于基本算术运算符,请注意以下几点:求余运算符求余运算符%要求两侧的操作数均为整数,如要求两侧的操作数均为整数,如14.1%3是错误的。是错误的。参加算术运算的两操作数中有一个是实数,则结果必是参加算术运算的两操作数中有一个是实数,则结果必是double型的。型的。 两个整数相除的结果还是整数,舍去小数部分。如

40、两个整数相除的结果还是整数,舍去小数部分。如10/3=3,-10/3=-3-:称为减法运算符,或负值运算符,如称为减法运算符,或负值运算符,如a-b, -9*:称为乘法运算符,如称为乘法运算符,如3*5, 3.14*r*r/:称为除法运算符,如称为除法运算符,如14/3, 10.8/0.25%:称为模运算符,或求余运算符,如称为模运算符,或求余运算符,如25%3=1算术表达式 C语言中的表达式表达式指的是用运算符把操作数连接起来的、符合C语法规则的式子,这里的操作数可以是常量、变量以及函数值等。 人们常把计算表达式结果的过程称为求解表达式求解表达式,表达式的运算结果称为该表达式的值值,运算结果

41、的数据类型称为该表达式的类型类型。因此,每个表达式都有自己的值和类型值和类型。 所谓算术表达式就是用算术运算符把操作数连接起来的、符合所谓算术表达式就是用算术运算符把操作数连接起来的、符合C语法规则的式子,例如语法规则的式子,例如 a*b/c-1.5+A就是一个算术表达式。又如,就是一个算术表达式。又如,10+7/5+15 怎样怎样求解表达式?求解表达式?运算符的优先级和结合性10+7/5+15 从小学数学起,老师就告诉我们,先乘除后加减,这实际上说明了运算符之间是有优先级的。在C语言中,也规定了各种运算符的优先级,参见P365附录III。这有点像清朝的官员有的是一品、有的是七品。一品级别高,

42、事事优先。在求解表达式时,也是按运算符的优先级别由高到低顺序进行。 由于由于*、/、%的优先级比、的优先级高,所以在的优先级比、的优先级高,所以在求解算术表达式时,先乘、除、求余,再加、减。求解算术表达式时,先乘、除、求余,再加、减。10+1+15 如果在一个表达式中,所有运算符是同优先级的,这时如何进行呢?为此,C中提出了结合性或结合方向的概念。结合方向规定了同优先级运算符是“从左至右”执行,还是“从右至左”执行。不同优先级的运算符,其结合方向可能不同。 由P365附录III可知,基本算术运算符基本算术运算符的结合方向是的结合方向是“从左至右从左至右”。 11+1526 在学习一种运算符时,

43、应掌握它的在学习一种运算符时,应掌握它的功能功能、操作数个数操作数个数、优先级优先级、结合方向结合方向等方面。等方面。 强制类型转换运算符 在计算2+1.2时,系统会自动进行类型转换,表达式的值为3.2,类型是double。但在有些场合,自动类型转换不能达到目的,如3.14%3不合法,单靠C系统的自动类型转换无法使其合法化,需进行强制类型转换,(int)3.14%3。 强制类型转换运算符的一般形式为强制类型转换运算符的一般形式为(类型)(类型)其用法是其用法是(类型)(表达式)(类型)(表达式)其功能是将一个表达式的值转换成所需的类型。例如,其功能是将一个表达式的值转换成所需的类型。例如,(i

44、nt)()(3.2x)(double)()(5%3) 需要注意的是,在强制需要注意的是,在强制类型转换时,系统会生成一类型转换时,系统会生成一个所需类型的中间变量用来个所需类型的中间变量用来存放转换结果。存放转换结果。 若若f是一个是一个float型变量,值为型变量,值为3.14,在进行,在进行(int)f强制类型转换时,系统会生成一个强制类型转换时,系统会生成一个int中间变量中间变量用来存放转换结果用来存放转换结果3,f的值不会改变。的值不会改变。 参见参见P57例例3.8。自增、自减运算符 自增运算符:自增运算符: 自减运算符:自减运算符: 作用:使变量作用:使变量i的值增的值增1用法:

45、用法:i+ +i作用:使变量作用:使变量i的值减的值减1用法:用法:i- -i一、两个表达式的求解过程不同下面以自增运算符自增运算符为例加以说明。虽然+i与i+都可以使得变量i增1,但有差别。二、在需要i的值参与其他运算的场合,二者作用不同5*(i+) i+是先使用是先使用i的值参与运算,然后再使的值参与运算,然后再使i增增1。5*(+i) +i是先使是先使i增增1,然后再使用,然后再使用i的值参与运算。的值参与运算。i+是先把是先把i的值作为表达式的值,再把的值作为表达式的值,再把i的值增的值增1;因此,该表达式的值等于;因此,该表达式的值等于i的旧值。的旧值。例如,若整型变量i的值为3,p

46、rintf(“%d”,i+); 输出3+i是先把是先把i的值增的值增1,再把,再把i的值作为表达式的值;因此,该表达式的值等于的值作为表达式的值;因此,该表达式的值等于i的新值。的新值。例如,若整型变量i的值为3, printf(“%d”,+i); 输出4 自增、自减运算符举例#include void main()int i=3,j;j=+i;printf(”%d”,j+);类似地,可以理解自减运算符的两种用法。类似地,可以理解自减运算符的两种用法。应特别注意的是,自增、自减运算符只能用于变量,例如应特别注意的是,自增、自减运算符只能用于变量,例如(a+b)+-(12+x)是不合法的。是不合

47、法的。3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 赋值运算符为赋值运算符为“=”,它是双目运算符,其用法是:,它是双目运算符,其用法是:变量变量=表达式表达式其功能是将表达式的值存放到变量中。例如,若有其功能是将表达式的值存放到变量中。例如,若有 int a=5; float b=1.28;在执行在执行 a=3 /* 把常量把常量3赋给变量赋给变量a */ b=3.14 /* 把把 3.14赋给变量赋给变量b* /后,后,a、b的值分别变为的值分别变为3、3.14。 我们知道,在我们知道,在C语言中,变量和表达式都有自己的类型。这样一来,如果语言中,变量和表达式都有自己的类型。这样一

48、来,如果赋值运算符两端的类型不一致,那么在赋值时要进行类型转换。赋值运算符两端的类型不一致,那么在赋值时要进行类型转换。 P59详细介绍了各种转换如何进行以及可能导致的结果。详细介绍了各种转换如何进行以及可能导致的结果。 进行赋值运算时类型转换规律 为了说明进行赋值运算时类型转换的规律,我们把数据类型排列如下,并且约定double的级别最高,下面最低,那么有如下结论: doublefloatlong int,unsigned long intint ,unsigned int char, unsigned char, short int 高高低低 当变量的数据类型级别高于表达式当变量的数据类型级别高于

温馨提示

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

评论

0/150

提交评论