第2章基本数据类型和表达式ppt课件.ppt
在此输入您的封面副标题第2章 基本数据类型和表达式Virus中国水利水电出版社中国水利水电出版社第二章 基本数据类型和表达式2.5 字符型数据字符型数据 2.4 实型数据实型数据2.3 整型数据整型数据2.1 基本数据类型基本数据类型 2.6字符型数据字符型数据 2.2 常量和变量常量和变量 2.7 运算符和表达式运算符和表达式 教学要求:v 掌握:C语言的基本数据类型和运算符;掌握运算符的运算规则和优先级v 理解:各种基本数据类型常量的表示方法 v 了解:变量的定义、赋值、初始化方法 2.1 基本数据类型 C语言的数据类型语言的数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。 单精度型 双精度型 数组类型 构造类型 数据类型 整型 实型(浮点型) 字符型 枚举类型 结构体类型 共用体类型 基本类型 指针类型 空类型 2.1 基本数据类型不同的数据类型具有不同的特点:v不同的数据类型有不同的取值范围。v不同的数据类型有不同的操作。v不同的数据类型即使有相同的操作有时含义也不同。 2.2 常量和变量 v在程序运行过程中,其值不能发生变化的量称为常量,其值可以发生变化的量称为变量。变量、常量需要有名字,命名是要讲规则的。2.2.1 标识符v标识符是用来标识变量、符号常量、函数、数组、类型、标号以及一些具有专门含义的有效字符序列。 v标识符可分为3类,即关键字标识符、预定义标识符和用户标识符。 2.2.1 标识符v1.关键字标识符 v2.预定义标识符 v3. 用户标识符2.2.2 常量v 常量可以区分为不同的类型:整型常量如1、2、0、-5,实型常量如5.1、2.1、-1.56,字符常量如a、w。这几种常量一般可以从字面上判断即可,这样的常量称为直接常量或字面常量。 2.2.2 常量v 例2.1直接常量的使用v # includev main()v v float sum; /*变量定义*/v sum=10.0+5; /*给变量赋值*/vprintf(“sum=%dn”,sum); /*输出*/v v 程序运行结果:v sum=15.0000002.2.2 常量v 例2.2符号常量的使用v # includev #define PI 3.14 /*宏定义语句*/v main()v v float r,s,v; /*变量定义*/v scanf (“%f”,&r); /*输入r的值*/v s= PI*r*r;v v=4/3.0*PI*r*r;v printf(“s=%f,v=%fn”,s,v); /*输出*/v 2.2.3 变量v在程序中,其值可以改变的量称为变量。变量有两个基本要素:一个是变量名,另一个是变量类型。 变量示意图 2.2.3 变量v 变量的使用要遵循一下规定:v 1. 变量名可以是C语言中的合法标识符,但用户在定义时应遵循“见名知意”的原则,以便程序的维护。v 2. 每一个变量都必须进行类型说明。未经类型说明的变量在编译时将被指出是错误的。v 3. 在一个数据类型后,变量名可以是一个变量名,也可以包含若干个变量名,各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。v 4. 最后一个变量名之后必须以“;”号结尾。v 5. 变量定义必须放在变量使用之前,一般放在函数体的头部分。v 6. 使用已经定义的变量时,要对它赋值才能进行使用。 2.3 整型数据 v2.3.1 整型常量v整型常量就是整常数。语言中,整型常量只区别整型和长整型两种形式,不区别带符号的数据,形式表示有如下几种:v1. 十进制整数v以下是合法的十进制整形常量:12、-532、123456、1024。v以下是不合法的十进制整形常量:027 (不能有前缀0)、13D (含有非十进制数码)。 v2. 八进制整数。v以下是合法的八进制整形常量:0214(十进制值为140),其值为:282+181+480=140,027(十进制为23)、0127(十进制为87)、01207223(十进制为331411)。v以下是不合法的八进制整形常量:而127(没有以0开头)、01D5(包含了非八进制数码D)、-0234(出现了负号)。v3. 十六进制整常数。以下是合法的十六进制整形常量: 0X127(十进制值是 295),其值为1162+2161+7160=295、0X2E(十进制为46)、0X1F (十进制为31)、0XFFEF (十进制为65519)。v以下是不合法的十六进制整形常量:B (没有以0开头)、0X3M (含有非十六进制数码M)。2.3.2 整型变量 v 1.整型数据在内存中的存放形式 2.3.2 整型变量v 根据变量的取值范围将整型变量分为:v (1)基本型:类型说明符为int,在内存中占2个字节。v (2)短整量:类型说明符为short int或short。所占字节和取值范围均与基本型相同。v (3)长整型:类型说明符为long int或long,在内存中占4个字节。v (4)无符号型:类型说明符为unsigned。2.3.2 整型变量v 2.整型分类 类型说明符数值范围字节数signed int-3276832767 即-215(215-1)2unsigned int065535 即0(216-1)2signed short int-3276832767 即-215(215-1)2unsigned short int065535 即0(216-1)2long int-21474836482147483647 即-231(231-1)4unsigned long int04294967295 即0(232-1)42.3.2 整型变量v 在设计程序时,应该注意变量类型的取值范围,当赋值超过其取值范围时,会出现溢出错误。 v例2.5 产生溢出错误的带符号整型数据运算。v# includevmain()vv Int i,j;v i=32767;v j=32767+1; /*整数b溢出*/v printf(i=%dn,i);v printf(j=%dn,j);vv运行结果为:vi=32767vj=-32768 2.3.2 整型变量v因为32767是整型数据可以表示数值的上限,加2后符号位为1 ,成为-32767的补码 2.3.2 整型变量v 例2.6 无符号整型数据的溢出。v # includev main()v v int a,b;v a=65535;v b=a+100;v printf(a=%u,b=%un,a,b);v v 程序运行的结果为:v a=65535,b=99 2.3.2 整型变量3. 整型变量的定义及初始化v 变量定义及初始化的一般形式:类型说明符类型说明符 变量变量1 ,变量,变量2,。;,。;v 类型说明符:可以是int、short int、long int、unsigned int、unsigned short int、unsigned long int。类型说明符与变量名之间至少用一个空格间隔。v 在一个类型说明符后,定义多个相同类型的变量,各变量名之间用逗号间隔。v 最后一个变量名之后必须以“;”号结尾。2.3.2 整型变量v 例 2.7 整型变量的定义及初始化。v main()v v int a,b;long c;v unsigned e;v a=-1;b=523;c=623789;e=89;v printf(“a=%d,b=%d,c=%ld,e=%un”,a,b,c,e);v v 运行结果如下:v a=-1,b=523,c=623789,e=89 2.4 实型数据 v 2.4.1 实型常量v 实数在C语言中又称为浮点数,有两种表示形式:v 1. 十进制小数形式。它由数字和小数点组成(注意必须有小数点)。v 2. 指数形式。其一般形式为:v a E n(a为十进制数,n为十进制整数)v 其值为 a*10n。 2.4.1 实型常量v 常对于特别大或特别小的数用指数格式比较方便,一般不太大也不太小的数用小数表示法比较直观。v 浮点型数据在内存中的存放分为尾数部分和指数部分,一般占4个字节。v 浮点数在表示数据时,常常是近似的。从数学意义上讲,两个不同的数字之间有无穷个实数,而计算机只能区分至少有一个二进制位(bit)不同的两个数字。如果要表示那些无穷无尽的各不相同的数字,就要使用无穷多的位。实际上计算机只能用较少的位(通常是32位或64位)来表示一定范围内的浮点数,因此有许多浮点数只能是近似的表示。2.4.2 实型变量v 1. 实型数据在内存中的存放形式v 在计算机内部实型数据都以指数形式存储,一般占4个字节(32位)内存空间,其中3个字节存放数字部分,1个字节存放指数部分。 实数3.14159在内存中的存放形式 2.4.2 实型变量v2. 实型变量的分类v 实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。 实型分类类型说明符比特数(字节数)有效数字数的范围Float32(4)6710-371038Double64(8)151610-30710308Long double128(16)181910-49311049322.4.2 实型变量3. 实型变量的定义形式及初始化实型变量也要在使用前先定义,实型变量定义的格式和书写规则与整型变量相同。 v 假定x已指定为单精度实型变量:v float x;v x=4815.123456;v 由于float型变量只能接受7位有效数字,因此实际存储的x的值只有4815.123是有效的。如果将x改为double型,则能接受上述10位数字并存储在变量x中。 2.4.2 实型变量v例2.13实型数据的溢出v# includevmain()vv float a,b,c,d;va=1.2E33;vb=0.5E-22;vc=0.25E-21;vd=a/b;vd=d*c;v printf(c=%fn ,d);v v结果会出现vFloating point error: Overflow 这是由于程序中a/b的运算的结果超出了float型能表示的范围产生溢出。所以在使用中应避免直接用一个较大的数除以一个较小的数。可以将程序的计算部分d=a/b; d=d*c; 改为:d=a*c; d=d/b; 或 d=a/b*c;以避免这种情况的发生。2.4.2 实型变量4. 实型数据的舍入误差v例2.14 实型变量舍入误差的检验。v# includevmain()vv float a,b;v a=123456.78e5;v b=a+20;v printf(“%fn”,a);v printf(“%fn”,b);vv程序运行结果为:v程序运行结果a和b值相等。原因是a的值比20大很多,a+20的理论值应是,而一个单精度实型变量只能保证7位有效数字,可以看到输出结果中的前7位数字是有效的,后面的数字是无意义的,并不准确地表示该数。2.5 字符型数据 2.5.1 字符常量 字符常量是用单引号括起来的一个字符。例如:x、f、!、#、等都是合法字符常量。C语言规定,字母是区分大小写的,所以X和x是两个不同的字符。 v 字符常量有两种表示方法:v 1可显示的字符v 2不可显示字符, 2.5.1 字符常量v转义字符主要用来表示那些用一般字符不便于表示的专用字符、图形字符和控制字符。转义字符转义字符的意义ASCII代码n换行10t横向跳到下一制表位置9b退格8r回车13f走纸换页12反斜线符92单引号符39”双引号符34ddd13位八进制数所代表的字符 xhh12位十六进制数所代表的字符 2.5.1 字符常量v 在语言中,字符常量有以下特点:v 1. 字符常量只能用单引号括起来,不能用双引号或其它括号。v 2. 字符常量只能是单个字符,不能是字符串。v 3. 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。 2.5.2 字符变量 v字符型变量(char)用来存放字符常量,一个字符变量只能存放一个字符常量,即单个字符。 v 1. 字符变量的定义v 字符变量的类型说明符为char,其定义格式和书写规则与整型变量相同。字符变量的定义形式如下:v char ch1, ch2; /*定义两个字符变量:ch1,ch2*/v ch1=a; ch2=b; /*给字符变量赋值*/2.5.2 字符变量v 2. 字符变量在内存中的存储和使用v 将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。在内存中,字符型数据是以ASCII码形式存放的,1个字符占1个字节。v 语言允许字符型数据与整型数据之间通用,但二者是有区别的:整型变量需占二字节内存单元,字符型数据则仅需1个字节。因此,当整型变量按字符型变量处理时,只有低8位字节参与处理。 2.5.2 字符变量v例2.20 字符变量以字符型和整型两种形式的输出。v# includevmain()v vchar a,b;v a=120;vb=121;vprintf(a=%c,b=%cn,a,b);vprintf(a=%d,b=%dn,a,b);v v程序运行结果:va=x,b=yva=120,b=1212.5.2 字符变量v 本程序中定义a,b为字符型,但在赋值语句中赋以整型值。从结果看,字符变量和整型变量是能用的,a,b值的输出形式取决于printf函数格式串中的格式符,当格式串为“%c”时,对应输出的变量值为字符;当格式串为“%d”时,对应输出的变量值为整数。2.5.3 字符串常量v 字符串常量和字符常量是不同的量。它们之间主要有以下区别:v 1. 字符常量由单引号括起来,字符串常量由双引号括起来。v 2. 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。v 3. 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量。v 4. 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符0 (ASCII码为0)。这是字符串结束的标志。v 如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。v 在C语言中没有专门的字符串变量,如果想把一个字符串存放到变量中保存起来,必须使用字符数组。 2.6 不同数据类型间的转换 v不同类型的数据在一起运算时,需要转换为相同的数据类型。转换的方式有两种,一种是自动转换(又称为隐式转换),一种是强制转换(又称为显式转换)。2.6.1 自动转换 v 自动转换发生在不同数据类型的数据在进行混合运算时,由编译系统自动完成。而且,对某些数据类型,即使是两个运算对象的数据类型完全相同,也要做转换,例如float、char。v 转换的原则是为两个运算对象的计算结果尽可能提供多的存储空间,即先将数据长短的数据转换成数据长度长的数据,然后再进行计算,计算结果为数据长度为长的数据类型。 不同数据类型间的自动转换 2.6.1 自动转换v 1. 类型不同,先转换为同一类型,然后进行运算。v 2. 图中纵向的箭头表示当运算对象为不同类型时转换的方向。可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。即按数据存储长度增加的方向进行,保证精度不降低。例如,int型与double型运算,直接(而不是逐级转换)将int型转换为double型再运算,结果也为double型。v 3. 图中横向的箭头表示必定的转换(不必考虑其它运算对象)。如字符数据参与运算必定转化为整数,float型数据在运算时一律先转换为双精度型,以提高运算精度(即使是两个float型数据相加,也先转换为double型,然后再相加)。2.6.2 强制类型转换 v 在C语言中,可以利用强制类型转换运算符将一个表达式转换成所需类型。v 其一般形式为:v (类型名)(表达式);v 其结果是将表达式的值强制转换成类型名所表示的类型,这里的小括号:( ),称为强制类型转换运算符。v 例如:v (double)a /*将a 转换成double类型*/v int(x+y) /*将x+y的值转换成整型*/v (float)(5%3) /*将5%3的值转换成float型*/2.6.2 强制类型转换v 注意:v 1. 表达式应该用括号括起来。如果写成v (int)x+yv 则只将x转换成整数,然后与y相加。v 2. 在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化,例如:v (int)x;v 如果x原指定为float型,进行强制类型转换运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型)。 2.6.2 强制类型转换v 例2.26实现保留小数点后2位有效数字。v # includev main()v v float a=12.3456;v a=(int)(a*100+0.5)/100.0;v printf(“a=%f”,a);v v 程序运行的结果为:v a=12.3500002.6.2 强制类型转换v 说明:v 1. 在强制类型转换时,只得到一个所需类型的中间变量,原来变量的类型没有发生变化。v 2. (int)(x+y)和(int)x+y不同:(int)(x+y)是将x和y相加后,把结果转换为整型,而(int)x+y是把x转换成int型之后再与y相加。2.7 运算符和表达式 vC语言提供了多种运算符,按其功能可分为:v算术运算符v关系运算符v逻辑运算符v逗号运算符v位运算符v赋值运算符2.7.1 算术运算 v + , ,* ,/ ,% v 算术表达式和运算符的优先级 v *, /, % 的优先级高于+, - ;* ,/, % 优先级为3,+ ,- 的优先级为4 运算符运算符名名 称称例例 子子运算功能运算功能加ab求a与b的和减ab求a与b的差*乘a * b求a与b的积除ab求a除以b的商取余ab求a除以b的余数2.7.2 自增、自减运算v自增(减)运算对一个运算对象进行算术运算之后,运算结果仍赋予该运算对象。因此,参加自增(减)运算的运算对象必须是变量。v+是自增运算符。v-是自减运算符。2.7.2 自增、自减运算v 参加自增(减)运算的运算对象必须是整型变量。v 自增和自减运算符可用在运算对象之前(称为前置运算),也可放在其后(称为后置运算)。例如,aa1;可以写成a;或a;aa1;可以写成a;或a;v 当自增或自减运算符与运算对象变量组成的运算表达式单独组成一条语句时,无论是前置运算,还是后置运算,其结果是一样的,即都是使该变量的值增加1和减少1。无论是前置运算还是后置运算,对自增或自减运算的对象变量而言,都要执行一次自增或自减运算,效果是一致的。所不同的是自增或自减运算表达式的值取的是变量自增(减)之前的值,还是变量自增(减)之后的值。2.7.2 自增、自减运算v 例2.29自增、自减运算符前置、后置形式的差异。v main()v v int i,j,x,y;v i=j=10;v x=i+;y=+j;v printf(i=%d, j=%d ,x=%d,y=%dn,i,j,x,y);v i=j=10;v x=-i;y=j-;v printf(i=%d, j=%d,x=%d,y=%dn,i,j,x,y);v 2.7.2 自增、自减运算v +和-运算符的优先级别是一样的,它们的结合方向是“自右向左”。如果有-i+,因为负号运算符和+运算符的优先级别一样,那么表达式的计算就要按结合方向,负号运算符和+运算符的结合方向都是“自右向左”,所以整个式子可以看作-(i+);即先从右边开始计算,+和变量i结合,然后再同负号运算符结合。如果i的初值为5,由于是后置形式,那么整个表达式的值为-5,i最终的结果为6。 赋值运算 v “=”的作用是将赋值号“”右边的表达式的值赋给赋值号“”左边的变量。其中,表达式可以是简单的一个常量或变量,也可以是复杂的常量、变量及运算符的组合。 v C语言规定,赋值运算是右结合性,即从右至左进行运算。 运算符运算符名名 称称例例 子子等价于等价于加赋值abaab减赋值abaab* 乘赋值a*baa * b除赋值abaab取余赋值abaab赋值运算v 当赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋当赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。应注意以下几点:值时要进行类型转换。应注意以下几点:v (1)将实型数据(单、双精度)赋给整型变量时,舍弃实数的小数)将实型数据(单、双精度)赋给整型变量时,舍弃实数的小数部分。部分。v (2)将整型数据赋给实型变量(单、双精度)时,数值不变,但以)将整型数据赋给实型变量(单、双精度)时,数值不变,但以浮点数形式存储到变量中。浮点数形式存储到变量中。v (3)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的故将字符的ASCII码值放到整型量的低八位中,高八位为码值放到整型量的低八位中,高八位为0。整型赋。整型赋予字符型,只把低八位赋予字符量。予字符型,只把低八位赋予字符量。 逗号运算 v逗号运算符(,)是C语言中一个比较特殊的运算符,它的作用是将若干个表达式连接起来。v逗号表达式的一般形式为:v表达式1,表达式2v逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,一直计算到表达式n的值,因此又称逗号表达式为顺序求解表达式。整个逗号表达式的值是最后一个表达式n的值。 逗号运算v 逗号表达式可以嵌套,即一个逗号表达式又可以与另一个表达式组成一个新的表达式,如:(x=3*2,x*4),x*2 ;/*整个逗号表达式的值是12,x的值是6 */v 逗号表达式也可以作为赋值运算的右边表达式来使用,如:x=(i=1,j=2,k=2);/*整个表达式为赋值表达式,将逗号表达式i=1,j=2,k=3的值赋给x,x的值为3 */v 逗号表达式用的地方不太多,一般情况是在for语句中给循环变量赋初值时才用到。程序中并不是所有的逗号都要看成逗号运算符,尤其是在函数调用时,各个参数是用逗号隔开的,这时逗号就不是逗号运算符。关系运算v比较两个量的运算符称为关系运算符 .v在使用关系运算符的时候应注意以下几点:v(1)关系运算符(,)的优先级别相同,和!也相同。前4种运算符的优先级别高于后2种。例如,“”与“”优先级相同,比“”优先级高。v(2)关系运算符的优先级低于算术运算符。v(3)在等优先级的情况下,关系运算的结合性是“自左至右”。 运算符运算符名名 称称例例 子子关关 系系大于aba大于b小于aba小于b大于等于aba大于等于b小于等于aba小于等于b等于a ba等于b!不等于a!ba不等于b逻辑运算v 用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。 v 在逻辑表达式的求解中,并非所有的逻辑运算符都能被执行到。 运算符运算符名名 称称例例 子子逻辑运算逻辑运算!非!a非a与aba与b|或a|ba或b条件运算 如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。条件运算符为“?”和“:”,要求有三个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。v 使用条件表达式时,还应注意以下几点:v (1)条件运算符的优先级别比关系运算符和算术运算符低,比赋值运算符高。v (2)条件运算符的结合方向为“自右至左”。v (3)表达式1的类型可以与表达式2和表达式3的类型不同。v (4)条件运算表达式中,表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型取二者中较高的类型。 位运算 v C语言支持全部的位运算符。位运算是对字节或字中的位进行测试、置位或移位处理。 v 位运算符中,除外,均为二目(元)运算符v 位运算只能用于整型或字符型的数据,不能用于实型数据。v 位运算符可以与赋值运算符结合,组成位复合赋值运算符,有,。运算符运算符名名 称称例例 子子运算功能运算功能取反b将b按位取反&按位与a&ba和b按位与|按位或a|ba和b按位或按位异或aba和b按位异或右移a3a右移3位左移a2a左移2位位运算v (1)取反运算取反运算符()为单目运算符,其优先级别与其它单目运算符相同,并且同级时自右向左结合。v (2)按位与、按位或及按位异或运算按位与(&)、按位或(|)及按位异或()运算是对两个操作数(8位或16位)的对应二进制位进行运算,每个二进制位的值只可能是0或1.按位与运算符(&),只有当两个操作数对应位上都为1时,&才把该位置成1。按位或运算符(|),只要两个操作数对应位上有一个为1,|运算符就把该位置成1。按位异或运算符(),只有两个操作数对应位不相等时(其中一个为0,另一个为1),就将该位置成1;否则,该位为0。v (3)移位运算移位运算符和均为双目运算符,它们只能对整型操作数进行运算。运算符和表达式的综合应用 v运算符的15级优先级请见表2-11实训项目 v实训 2-1定义有关学生个人信息的变量名,如姓名、性别、家庭地址等;v实训 2-2定义有关科目相关信息的变量名,如英语教师、数学用书等;v实训 2-3定义有关成绩的变量名,如英语期末成绩、高等数学最高分、班级平均分等; Virus