资源描述
,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第3,章 数据类型、运算符与表达式,漳州师范学院 赵红,C,语言程序设计,1,教学要求,教学要求:,了解,C,语言中数据类型的分类;掌握整型、实型、字符型、字符串常量的表示方法;掌握符号常量的定义和使用;掌握变量的定义、存放形式、初始化、使用方法;掌握基本算术、强制类型转换、自增、自减、赋值、逗号运算符和表达式;掌握各类数值型数据间的混合运算。,教学重点:,整型、实型、字符型常量的表示方法和变量的定义、存放形式、初始化、使用方法;算术、赋值、逗号运算符和表达式。,教学难点:,自增、自减运算符和表达式;混合表达式计算。,2,为什么要指定数据类型,?,3,第3,章,C,的数据类型,双精度型,double,数据类型,基本类型,空类型(无值类型),void,构造类型,指针类型,整型,int,实型(浮点型),字符型,枚举类型,结构体类型,struct,数组类型,共用体类型,union,单精度型,float,C,语言数据类型,4,为什么要指定数据类型,?,1,不同类型的数据在内存中占据不同长度的存储区。,2,不同类型的数据取值范围不同。,3,不同类型的数据有不同的操作。,C,语言对程序中要用到的每一个变量,都要事先指定它的数据类型!,5,常量的分类,常量的定义:,常量的分类:,直接常量,符号常量,表达形式:,(,1,)整型常量,6、432、76543、546783424,(2,)实型常量,2.23、546.2487615247,、,3.057439+5,(3,)字符常量,a 、6 、M,(4),符号常量,WHI,#define,WHI,I am a student.,WHI,是,符号常量,直接常量,6,例,3.1,符号常量的使用。,#,define PRICE 30,main(),int,num,total;,num=10;,total=num*PRICE;,printf,(“total=%d,total);,格式控制字,符串中的普通,字,符,照原样输出,符号常量,运行结果:,total=300,符号常量,符号常量必须,先定义,后才能用它表示一个数值。,符号常量的值在其作用域内,不能,改变,也不能再被赋值。,习惯:,符号常量名用大写,变量用小写。,好处:,含义清楚;“一改全改”,7,预备知识:标识符,P39,用于程序中的变量、符号常量、数组、函数、数据类型等操作对象的,名字,由,字母,、,下划线,和,数字,组成的字符序列,1,系统定义标识符,(,关键字,),具有固定名字和特定含义的标识符,2,用户定义标识符,用于对用户使用的变量、数组、函数等操作对象进行命名,8,对标识符的规定,用户定义标识符,必须以,字母,或,下划线,“,_”,开头,不能含有除字母、数字和下划线“,_”,外的其他字符,标识符中大小写字母含义不同,关键字,必须用,小,写字母。不允许使用关键字为变量、数组、函数等操作对象命名,9,在程序运行过程,中,其值可以被改变的量称为,变量,。变量的三个要素:,(,1,)变量名。每个变量都必须有一个名字。,(,2,)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。,(,3,)变量的类型,例如:,int,a=23;,a,(,2,个字节,),变量的类型,int,变量名字:,a,变量的值:,23,在内存中存储单元占,16,位,0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1,二进制数值,变量的概念,注意区别变量名和变量值,10,main(),int,x,y;,x=5;y=3,;,printf,(“%d-%dn”,x,y);,x=1;y=2,;,printf,(“%d-%dn”,x,y);,运行结果,:,5-3,1-2,x、y,是整型变量,每个变量分配,2,个字节存储单元,将数值,5、3,分别存放到,x、y,变量的,存储单元,x、y,变量的值重新赋值,例:输出变量的数值。,x,y,5,3,1,2,11,(1),变量定义的一般格式:,存储类型,数据类型 变量名,变量名,2,;,例如,:,int,a1,a2,a3;,(2),变量初始化:,存储类型,数据类型 变量名,=,初值,变量名,2=,初值,2,;,例如,:,float a1=2.5,a2=5.23,a3=45.43;,变量 的定义与初始化,12,整型数据在内存中的存放,数值是以补码表示的。,一个正数的补码与原码相同;,一个负数的补码求法,:原码的二进制形式,取反求得反码,再加,1,,得到负数的补码。,例如:,-8,的,原码,1 0 00,00 00 00,00,10 00,求反码,1 1 11,11 11 11,11,01 11,补码,11,11 11 11 11 11,10 00,整型常量在内存中的存放,13,3.3.3,整型常量的类型,p43,类型名称,类型符,bit,取值范围,整型,(,短整型,),signed,int,signed short,int,16,2,15,2,15,-1,(-32768,32767),无符号整型,unsigned,int,16,0,2,16,-1,(0,65535),长整型,signed long,int,32,-2,31,2,31,-1,无符号长整型,unsigned long,int,32,0,2,32,-1,方括号表示可选项,int,分配,2,Byte,,,long,分配,4,Byte,14,1.,整型常量,整型常量的类型:,根据值大小默认类型。,整型常量后面加,l,或,L,,,则认为是,long,int,型,例如:,123,L,、0,L,、432,l,、0 x100,l,注意:,十六进制常量中可以使用大写字母,AF,,也可以使用小写字母,af。,八进制常量中不能出现数字,8,或,9,例如:,018,、,0921,非法,15,#,include,main(),printf(“0 x80-%d n,0 x80);,printf(“0200-%d n,0200);,printf(128-%d n,128);,printf(128-,%o,n,128);,不,输出前缀,数字,以数字,开头,例 输出不同进制整型常量,实战,运行结果,:,0,x80-128,0200-128,128-128,128-200,16,1.,整型变量分为类:,(,1,)基本整型(,int,),(2),短整型(,short,int,),(3),长整型(,long,int,),无符号整型。无符号型又分为,(3种):,unsigned ,int,unsigned short,unsigned long,3.3.2,整型变量,(,复习,),17,1.,实型常量(实数,又称浮点数)表示形式,:,(1,)十进制形式,例如,:3.14,、,9.8,(2,)指数形式,E(e),例如,:3.02+5 34.42367750+7,注意指数形式的写法:,P45,3.4.1,实型常量,18,实型变量分类,(,1,)单精度型,变量,float,型,变量,占,4,字节(,32,位),提供,7,位有效数字,值域:,(3.4,e-383.4e+38)(2),双精度型,变量,double,型,变量,占,8,个字节,(64位),提供,1516,位有效数字,值域:,(1.7,e-3081.7e+308),3.4.2,实型变量,19,3.4.2,实型变量,类型说明符,位数,数值范围,单精度,float3210,-37,10,38,双精度,double,64 10,-307,10,308,长双精度,long double 128 10,-4931,10,4932,20,数值的有效,数字,7,位,尾数,7031,不是有效数值,3.4.2,实型数据的舍入误差,21,1.,字符常量的定义,用一对单引号括起来的单个字符称为字符常量。,例如,:,A,、,7,、,等。,2.,转义字符,语言还允许使用一种特殊形式的字符常量,就是以反斜杠,“,”,开头的转义字符。,n b r t 0,”,ddd,xhh,注意:,如果反斜杠本身作为字符常量,必须使用转义字符:,、,”,3.5,字符数据,P48,22,3.,以“,”,开头的字符在,printf,函数中控制输出格式,:,n,换行,t,横向跳格(下一个输出区,),b,退格,r,回车,反斜杠字符,“,双引号,ddd,1,到,3,位,8,进制数所代表的字符。如:,101=,A,xhh,1,到,2,位,16,进制数所代表的字符。,3.5.1,字符常量,P48,23,main(),printf,(,“ABC ,tabc,txyz,n,”,);,printf,(,“,abc,bxyz,n,”,);,程序运行结果如下,:,例用转义字符输出字符和不可打印字符,24,字符变量,(,关键字为,char,),字符变量类型,,,占用,1,字节,内存单元。,(1),变量值的存储,将一个字符常量存储到一个字符变量中,实际上是将该字符的,ASCII,码值(,无符号整数,)存储到内存单元中。,(2),变量值的特性,字符数据在内存中存储的是字符的,ASCII,码(一个无符号整数),其形式与整数的存储形式一样。,3.5.2,字符变量,25,char ch1,ch2;/*,定义变量:,ch1,ch2*/,ch1=,a,;/*,给字符变量赋值*,/,ch2=,b,;,字符数据,a 、b,的,ASCII,码值,97,、,98,(一个无符号整数)分别存放在变量,ch1,ch2,所占用内存存储单元中,其形式与整数的存储形式一样。,ch1 ch2,97,98,3.5.3,字符变量的存储形式,26,(3,)一个字符型数据,既可以,字符形式,输出,也可,以,整数形式,输出。,例:字符变量的字符形式输出和整数形式输出,。,main(),char ch1,ch2;ch1=a;ch2=b;,printf(“ch1=%c,ch2=%cn”,ch1,ch2);printf(“ch1=%d,ch2=%dn”,ch1,ch2);,3.5.3,字符变量的使用方法,程序运行结果:,ch1=a,ch2=b,ch1=97,ch2=98,27,(4,),允许对字符数据进行算术运算,此时就是对它们的,ASCII,码值进行算术运算。,例,3.11,字符数据的算术运算。,main(),char ch1,ch2;ch1=a;ch2=B;/*,等价于,ch1=97;ch2=66;,*/,printf(“ch1=%d”,ch1-32);/*,字母的大小写转换*,/,printf(“ch2=%d n”,ch2+32);printf(“ch1=%c,ch2=%cn”,ch1-32,ch2+32);,3.5.3,字符变量的使用方法,运行结果:,ch1=65,ch2=98,ch1=A,ch2=b,28,(1),字符串常量的概念和字符串长度,字符串常量,:,是用一对双引号括起来的若干字符序列。,字符串长度,:,字符串中字符的个数称为。,空串,:,长度为,0,的字符串(即一个字符都没有的字符串),表示为“”(一对紧连的双引号)。,例如字符串常量,:,“,How do you do.”,长度为,14,(空格也是一个字符),“,Good morning.”,长度为,13,如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。例,C:msdosv6.22 C:,msdos,v6.22,I say:Goodbye!I say:Goodbye!,3.5.4,字符串常量,29,4.,字符串常量,用双引号括起的一个字符序列,例如:,ABC,、,123,、,a,、,nt,nGood,morning,字符串常量的长度,:,所包含的字符个数,字符串常量的存储方式:,n,G,o,o,d,m,o,r,n,i,n,g,0,a,0,所占存储单元数:,串长度,1,例如:,字符串,结束标记,30,例,3.13,输出字符串常量,main(),printf,(%sn,I say:Goodbye!,);,3.5.4,字符串常量,运行结果:,I say:Goodbye!,31,C,语言规定:,在存储字符串常量时,由系统在字符串的末尾自动加一个,0,作为字符串的结束标志。,如果有一个字符串为“,CHINA”,,则它在内存中的实际存储如下所示:,C H I N A,0,最后一个字符,0,是系统自动加上的,它占用,字节,而非字节内存空间。,3.5.3,字符串的存储,32,例:字符常量,A,与字符串常量,A,的区别:,(,1,)定界符不同:,字符常量使用,单引号,A,,,而字符串常量使用,双引号,;,(,2,)长度不同:,字符常量的长度固定为,1,,而字符串常量的长度,可以是,0,,也可以是某个整数;,(,3,)存储要求不同:,字符常量存储的是字符的,ASCII,码值,,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志,0,。,3.5.4,字符常量与字符串常量的区别,33,复习:变量定义,变量定义的一般格式:,数据类型说明符 变量列表,;,例如:,int,i,j;,long k,m;,float x,y;,char ch1,ch2;,必须使用合法的标识符作变量名,不能使用关键字为变量命名,34,总结一下,标识符命名规则,数据基本类型,常量、变量,整型常量整型变量,实型常量实型变量,字符常量,P48,字符变量,字符串常量,常量,2,5.3,5,e2,a,567,xab,“,abcdef,”,定义变量,int,a;,float b;double d;,char c;,a=5;b=3.6;c=f;,35,3.6,表达式,-,变量赋初值:,允许在说明变量的时候对变量赋初值。,例如:,int,a=5,b=10+2;,double x=23.568,y;,char ch1=a,ch2=66,ch3=142;,表示定义变量并对变量存储单元赋值。,错误的初始化:,int,a=3+b,b=5;,float m=n=23.16;,36,3.7,各类数值型数据间的混合运算,数据类型,不同类型数据混合运算时的类型转换,不同类型数据进行混合运算时,,C,编译器会自动进行类型转换。,为了避免不同的数据类型在运算中出现,混淆,,应,尽量使用同种,类型数据。,int,i;float f;double d;long e;,10+a+i*f-d/e,结果的类型是?,例:,2+2.5=?,37,数据类型的自动转换,转换原则:,自动将精度低、表示范围小的运算对象类型向精度高、表示范围大的运算对象类型转换,char,short,double,long,float,unsigned,int,高精度,低精度,3.7,运算中数据类型的转换,P54,38,2.,赋值运算中的类型转换,=,小数部分自动补,0,int,a=23;float f;,f=a;,f=23.00000,=,自动舍去实型表达式的小数部分(,注意不进行四舍五入,),P59,例,int,i;i=3.56;,39,数据类型的强制转换,强制转换的一般形式,(,类型名,),表达式,例如:,(,int,)(b+3*x)%3,1/(float)a+6,注意:,(,float),22,/5,与,(,float),(,22/5,),不同,P57,例3.8(,只是产生了中间变量,,x,本身不变,),形式:,隐式转换 (由系统自动进行),显式转换 (强制类型转换),5/2=2,5/2.0=2.500000,40,3.8,本节所涉及的运算符,+-*/%,+-+-,=+=-=*=/=%=,&=|=,?:,&,sizeof,(,数据类型标识符,),P55,类型,种类,算术运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,条件运算符,逗号运算符,其他运算符,41,运算符的优先级和结合性,优先级,指各种运算符号的运算优先顺序,例如:算术运算优先于关系运算,算术运算中先*,/,后,+-,结合性,指运算符号和运算对象的结合方向,分为:从左向右,(,左结合,),和从右向左,(,右结合,),例如:,算术运算符为,左结合,a-b,+,4,赋值运算符为,右结合,a=b=5,(C,语言规定见教材,P365,附录,),4+2*3-2=?,42,算术运算,算术运算符的优先级,(),+,-+-,*/%,+,-,同级 同级 同级,单目 双目,高,低,没有乘方运算符,,要计算,a,3,要写作,a*a*a,的连乘,或用标准库函数,pow,(a,3),“,/,”,的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据,“,%,”,要求运算对象,必须是整型数据,,功能是求两数相除的余数,余数的符号与被除数的符号相同。,5/3=1,-5/3=-1(,向零取整,),5/-3=-1,5%32,5%-3=2,-5%3=-2,43,自增自减运算,+,-,是单目运算符,有前缀和后缀两种形式,前缀形式,:,先自增,(,自减,),再引用;,后缀形式,:,先引用再自增,(,自减,),;,功能:,前缀形式,+,a,等价,于,a=a+1,-,a,等价,于,a=a,1,后缀形式,a+,等价于,a=a+1,a,-,等价于,a=a 1,表达式的值会不同,44,例如:,当,a5,时,(1),b=+a,等价于,a=a+1;b=a,表达式的值为,6,,且,a=6,b=6,(2),b=a+,等价于,b=a;a=a+1,表达式的值为,5,,且,a=6,b=5,45,说明:,+,和,-,的运算对象只能是,变量,(或运算结果是变量的表达式),不能是常量(或运算结果是数值的表达式)。,例如:,5+,、,(,a+2)+,不合法。,具有右结合性,结合方向为从右到左。,例如:,a+,等价于,-(,a+),实战,46,赋值运算,赋值运算符,(,右结合),=+=,-,=*=/=%=,&=|=,赋值表达式,将,表达式的值,存入,变量,对应的内存单元中,m=12,a,*=,3,等价于,a=a*3,C,+=,1,等价于,CC+1,m,%=,3+n,等价于,m=m%(3+n),47,说明:,赋值号左边必须是变量,右边可以是,C,语言任意合法的表达式,例如:,n=t+2s,合法,a+b=15,不合法,赋值号与数学中的等号含义不同,例如:数学中,a=b,等价于,b=a,C,语言中,a=b,不等价于,b=a,实战,48,逗号表达式运算,逗号表达式的一般形式,表达式1,表达式2,,,表达式,n,逗号表达式的值,(,优先级别最低,),从左向右,依次对表达式求值,最后得到,表达式,n,的值就是逗号表达式的值,例如:,a=5,a+,a*3,表达式,值为,18,,且,a=6,t=1,t+5,t+,表达式,值为,1,,且,t=2,x=(,a=3*5,a*4,),赋值表达式,的值为,60,,且,x=60,a=15,x=a=3*5,a*4,表达式,值为,60,,且,x=15,49,本章主要内容,本章介绍,C,语言的基础,包括:,数据类型,运算符和表达式,均是程序设计的基本知识,为什么讨论,这些知识,?,通常,程序,要对数据进行操作处理:,处理的对象是,数据,通过,运算符和表达式,进行操作,50,
展开阅读全文