资源描述
C,语言程序设计,C,语言程序设计,C,语言程序设计,C,语言程序设计,上一页,下一页,C语言程序设计教程,第 2 章,C,语言的基本数据类型与表达式,2.1,C,语言的基本数据类型,2.2 常量与变量,2.3 运算符与表达式,2.,4 数据类型转换,教学目的和基本要求:,要求学生清楚数据类型与变量、常量的关系,掌握各种常量的性质和定义,掌握表达式中各种运算符的功能和特点,明白产生副作用的原因,了解数据类型的相互转换规则。,教学重点:,数据类型、常量定义,运算符与表达式。,存取数据必须先确定数据的编码方式、存储格式和所占的存储长度,,C,语言中把这三者结合起来,给出几种固定的形式,这些形式就是最基本的,数据类型,。,2.1,C,语言的基本数据类型,为什么要设置数据类型?,在计算机中使用,一定长度的存储单元,(通常是字节的倍数)来存储数据。,存储的,编码方式,有:原码、反码、补码、,ASCII,码。,存储的,存储格式,有:定点型、浮点型。,其中,,用于存储数据的存储单元的长度决定了数据取值范围的大小。,字符,型(,char,),整型,(,short,int,long,unsigned,),单精度型(,float,),实型,双精度型(,double,),枚举类型(,enum,),数组类型(, ,),构造类型 结构体类型(,struct,),共用体类型(,union,),指针类型(,*,),空类型(,void,),基本类型,数据类型,一、数据类型概述,本章中将对基本类型中的前三类进行介绍和学习。,变量:,指,以标识符为名字,其值可以改变的量。,在学习各种数据类型之前,我们先简单了解一下,常量,和,变量,的概念。后面的章节中将会详细介绍。,常量,:,指在程序运行中,其数值不能被改变的量。,变量,代表计算机内存中的某一存储空间,变量的类型决定了该存储空间的长度和其,中存放,数据的编码方式及存储格式。,变量的类型也决定了该存储空间中存放数据的数据形式和取值范围。,*,八进制的数码范围为07; 018,*,十六进制的,数码除了数字,0,9外,还使用英文字母,a f (,或,A F),表示1015。,如:0,x1e,注意!,二、整型(采用定点整数的存储格式,只能表示纯整数),1、,整型常量:,(1),十进制形式:,与数学上的整数表示相同;,例如: 12, -100, 0,(2),八进制形式:,在数码前加数字0;,例如: 012=1*8,1,+2*8,0,=10(十进制),(3),十六进制形式:,在数码前加0,X(,数字,0,和字母,X,)。,例如: 0,x12=1*16,1,+2*16,0,=18(,十进制),如,Turbo C,中,有,short(2,字节,),int(2,字节,) ,long(4,字节,),关键字,所占位数,取值范围,short 16,-3276832767,unsigned short 16,065535,int 16,-3276832767,unsigned 16,065535,long 32 -2147483648,2147483647,unsigned long 32,04294967295,2、,整型变量的分类:,根据数据所占的存储长度的不同分为:,int,、short、long;,同样存储长度的数据又分,unsigned、signed;,故可组合出六种类型。,3,、,整型变量的值域:,由机器中数据的存储长度决定,思考:,int,a=20000,b=20000,c;,c=a+b; c,的值为多少?,如果,c,定义为,long,型是否能解决问题?,2、,实型变量的分类及值域,:,关键字 字节数 取值范围 精度(位),float,4,3.4,10,-38,3.4,10,38,7,double,8,1.7,10,-308,1.7,10,308,15,注意,三、实型,1、,常量:,(1),十进制小数形式:,由数字和小数点组成;,例如: 3.4, 4., .3。,(2),指数形式:,“,十进制小数,”,+,“,e(,或,E),”,+,“,十进制数整数,”,。,例如: 12.5,e-6,表示12.5,10,-6,。,小数点不能单独出现; 0.,.0,.,e,或,E,的两边必须有数,且其后面必须为整数;,如: 6,E0.2,e5,字符形式 功能,n 换行,t 横向跳格,b 退格,r 回车, 反斜杠字符,单引号字符,ddd 8进制数表示的ASCII码对应的字符,xhh 16进制数表示的ASCII码对应的字符,四、字符类型,1、,常量:,(1) 用单引号括起来的一个字符;如:,A,、,1、?,等,。,(2) 用单引号括起来的由反斜杠(,)引导的转义字符。,4、,字符串常量:,是用一对双引号括起来的字符序列。,注意:每个字符串的后面都有一个,0,结束符。,如:,“,SHANGHAI,”,,,“,AbcdeFGHijk,”,,,“,How are you,”,。,注意,a,与,“,a,”,的区别。,例如:字符,A,的,ASCII,码为:,65,D(,十进制)=41,H(,十六进制)=101,Q(,八进制),字符,A,可以表示为,A,、,x41,、,101,。,2、,字符型变量的分类:,char,和,unsigned char,;,3、,值域,(字符型可参与数学运算,也可看成一种一字节的整型变量),每个字符型数据在内存中占,一,个字节;包括,ASCII,字符表中的所有字符(可显示字符和非显示字符)。,一、常量与符号常量,常量,是指在程序运行中,其数值不能被改变的量。,常量,又可分为直接常量和符号常量。,2.2 常量与变量,120,、 -100、 0;,0120,、 072;,0,xFFFF,、 0x1e、0X28AF,0XED4 ;,120,L, 200L,;,长整型常量,3,.14、 -3.1、 5.12,E-6,;,a,、,#,、,n,、,101,;,099、12f、 0xg 、48EA ;,019.5 、1e-08;,实型常量只能用十进制形式表示,2.1,E10.2,、,E-6,、6.4E+4.8、E9,;,changsha,、,+?,ab,;,、,p,、,、,ab,;,1、,直接常量:,是在程序中直接引用的数据。,请判断这些常量正确与否:,定义形式:,#,define,标识符,常量数据,例如,:,#,define P,I,3.14159,在程序预处理时,凡是出现标识符,PI,的地方都将用,数据3.14159来替换。,如: 2*2.3*,P,I,就,等价于 2*2.3*3.14159。,变量是指,以标识符为名字,其值可以改变的量。,变量代表计算机内存中的某一存储空间,该存储空间,中存放,的数据就是变量的值。,在同一程序块中,,变量,不能被重复定义。,使用变量时必须“先定义,后使用”。,2、,符号常量,是,用标,识符来表示一个数据;,在程序不能给它赋值。,二、 变量,1、,定义形式:,类型标识符,变量名,1 ,变量名2,变量名3.,;,自己设定,满足标识符的规定。,如:,int,float,char,;不可省,2、,变量初始化,在,定义变量,的同时给变量一个初始值,。,注意,int a=5, b=3;,int a=b=c=3;,int a,b,c; a=b=c=3;,例如:,int,a,b,c ;,float x,y;,char c1,c2;,或,int,c1,c2;,定义变量就是在内存中划出一块相应类型的存储空间存放该变量的值。,main( ), int x,y,z,w; /*,定义,x,y,z,w,为整型变量*/,unsigned int k; /*,定义,k,为无符号整型变量*/,x=10;y=-20;k=30;,z=x+k;w=y+k;,printf(,“,x+k=%d,y+k=%dn,”,,z,w);,例,2-1:,程序运行结果为:,x+k=40,y+k=10,变量根据作用域的不同可分为,局部变量,和,全局变量,,根据存储方式的不同可分为,静态存储变量,和,动态存储变量,,这些我们将在第六章中详细介绍。,在数学里当多个运算符一起组成一个表达式时,我们规定了,优先级,(先乘除后加减)和,结合规则,(从左至右)。,同样,在,C,语言中,我们也规定了每个运算符的结合规则及运算符之间的优先级。,2.3,运算符与表达式,运算符:就是表示某种运算功能的符号。,按操作功能运算符大致可分为:,算术运算符、关系运算符、逻辑运算符、赋值运算符、,条件运算符、逗号运算符以及,按位运算符,等。,表达式:是由操作数和运算符组成的序列。,如:1+2*3-4 、 35-7 、,a=b%2,等都是,C,语言中的表达式。,下面分类介绍各种运算符:,%(取余,)(注意:取余运算的操作数只能是整数,且结,果的符号与前一操作数的符号相同),一、 算术运算符和算术表达式,1、,运算符,+(加):3+4、 +3,-(减):3-5、 -5,*(乘):3*5,/(除):5/2、5.0/2 (注意,此二种形式,结果不同),5%3的值为2; -5%3的值为-2;,5%(-3)的值为2; -5%(-3)的值为-2;,12.3%3,若,a%b,的结果为0,则有,a,能被,b,整除,2、,算术表达式,用算术运算符和括符将操作数连接起来的式子。,优先级:() *、/、% +、-,结合性:从左至右;,表达式的值:,数值型(,int、long、unsigned、float、double);,例如:,已知:,float a=2.0;,int b=6,c=3;,求解:,a*b/c-1.5+,a,+fabs(-5)=,?,float a=2.0;,int b =6,c =3;,a*b/c -1.5 +,a,+fabs(-5),12.0,/3,5,4.0,- 1.5,2.5,+,97(,int),99.,5,+ 5,104.,5,(,double),思考,int,a=1,b=2;,表达式,a/b+3,的结果是多少?,int,a=10000,b=30000;,表达式,a+b,的结果是多少?,如何修改?,double float,unsigned long,long,unsigned,int,int char,short,等价于:,j=i;i+;,所以,i,的值为4,,j,的值为3,等价于:,i+;j=i;,所以,i,的值为4,,j,的值为4,(1) i=3;,j=i+;,(2) i=3;,j=+i;,3、,自增与自减运算符,(+ 、,-,),+,i,-i:,使用之前使,i,的值增1(或减1);,i+,i-:,使用之后使,i,的值增1(或减1);,分析下面几种情况中,i,与,j,的值:,当+、,-,不与其他运算符混合使用时,+,i,与,i+,都等价于,i=i+1, -i,与,i-,都等价于,i=i-1,如:,i = 2;,j = -i+;,求执行完这两句后,i,与,j,的值分别是多少,特殊的:设,i=3,j=4,k=i+j, k=,i=,j=,结合性:自右至左。,分析:,“,+,”,与,”,-,“,是同优先级,且都高于,“,=,”,按结合规则,等价于:,j=-(i+);,结果:,i,的值为3,,j,的值为-2。,再看几个例子:,如:设,i=3,k=(i+)+(i+)+(i+) k=,i=,9,6,如:设,a=3,b=(a+)+(a+),b=,a=,6,5,设a=3,b=(+a)+(a+) b= a=,8,5,设a=3,b=(a+)+(+a) b= a=,8,5,设,a=3,b=(+a)+(+a),b= a=,10,5,7,4,4,1,、,6种关系运算符:,= = !=,2、,关系表达式:,用关系运算符将表达式连接起来的式子,优先级,: (= ),(,=,!= ),结合性,:自左至右;,表达式的值,: 若为真,则结果为,1,;,若为假,则结果为,0,。,35 值为: 32 值为:,设,x=-2; -3x-1,值为:,设,x=1; 2x4,值为:,例如,二、关系运算符和关系表达式,求,如下关系表达式的值:,0,0,0,1,算术运算符优先级高于关系运算符,3+(43)*4 值为:,3+4,&,|,结合性:自左至右;,表达式的值: 若为真,则结果为,1,;,若为假,则结果为,0,。,三、逻辑运算符和逻辑表达式,1、,3种逻辑运算符:,& | !,参与逻辑运算的操作数叫逻辑量。,逻辑量可以是整型、实型、字符型和指针类型,,其中,0,0.0,0,NULL,代表,假,,其余逻辑量代表,真,。,int a=5; float b=3.5;,!a ( ),!(a b) ( ),a & b ( ) !a&b ( ),!a&!b ( ) !(a&b) ( ),a,b (,) !a|b ( ),!a|!b ( ) !(a|b) ( ),(a 0) ( ),(a 0) ( ),例如,0,1,1,0,0,0,1,1,0,0,0,1,例如表达式运算如下:,混合优先级:,! 高,算术运算符,关系运算符,&和|,赋值运算符 低,4 - 0,1 & 2,8 3 & 2 | 8 4 - !5,例如:,(1),a = 0; b = 1;,c = a+ ,执行后:,a,为 ,b,为 ,c,为 。,逻辑或优化和逻辑与优化:,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,1,1,0,(2),a = 1; b = 1; c=0;,d = -a,b-,(c = b+3 );,执行后:,a,为 ,b,为 ,c,为 ,d,为 。,0,0,0,1,例如:,(,1),n,是,小于,m,的偶数:,(2),year,是,闰年:,(能被4整除但不能被100整除,或能被400整除),逻辑表达式一般用于控制语句中的条件:,n ,算术,关系,&,|,赋值,结合性:自右至左;,表达式的值:,被赋值变量的值,。,y,值为12,,x,值为3,表达式的值为3,y,值为3,,x,值为3,表达式的值为3,y,值为3,,x,值为3,表达式的值为3,练习:,设,a=12,,计算表达式,a+=a-=a*12,和,a+=a-=a*=12,的值,3、,复合赋值运算符,*=、/=、 %=、 +=、 -=, =, &=、,=、,=,复合运算符是一个运算符,但功能上,是两个运算符功能的组合。,例如:,a+=b,相当于,a=a+b,a*=b,相当于,a=a*b,注意:,a*=b+c,相当于,a=a*(b+c),而不是,a=a*b+c,优先级: 与 = 是同一优先级。,结合性:自右至左;,表达式的值:,被赋值变量的值,。,-,264,0,求值规则:,先求解表达式1的值,若为真(非0),求解表达式2,并把表达式2的值,作为整个条件表达式的值,若为假(0),求解表达式3,并把表达式3的值作,为整个条件表达式的值,四、其它运算符,1、,条件运算符,?,和,:,它们与三个操作数组组成三元运算。,形式为: ? :,优先级: 逻辑,条件,赋值,结合性:自右至左;,2、,逗号运算符:,,,形式: 表达式1,表达式2,表达式,n,求值规则: 从左至右依次计算各表达式的值,;,优先级: 最低;,结合性:自左至右;,表达式的值:最后一个表达式的值。,又如:,y = x10 ? x/10 : x0 ? x: -x,当,x,的值为整型的,15,时,表达式的结果为:,当,x,的值为整型的5时,表达式的结果为:,1,5,例如:,int,max,a=5,b=3;,max=ab?a:b,求,max,的值,max,的值为5,例如:,a b y,表达式,y=a=4,b=5,a+b;,y=(a=4,b=5,a+b);,y=(a=4,b=5),a+b;,y=a=(4,b=5),a+b;,4,5,4,9,4,5,9,9,4,5,9,5,5,5,5,10,形式有两种:,sizeof,变量名,sizeof (,类型名),结果为整型数。,int a;,float x;,printf(“%d,%d”,sizeof a,sizeof x);,printf(“%d,%d”,sizeof(int),sizeof(float);,以上两个,printf,语句结果均为 。,例如,3、,求,字节运算符:,sizeof,作用:求得变量或某种数据类型所需的字节数。,2,4,C,语言允许整型、实型、字符型数据进行混合运算。,有3种转换方式:自动转换、赋值转换和强制转换。,一、类型自动转换,2.4 数据类型转换,double float,unsigned long,long,unsigned,int,int char,short,特点:由数值存储位数少的向多的转换;整型向实型转换!,操作数为相同类型的不转换,仍取原类型,特别注意此时可能带来的错误!,int x=2;float y=1.6;char c=A;,则:,c + 1/x * y,=,=,例如,char c=68.5;,printf(“%c”,c);,65(,int,)+ 0(,int,) * 1.6(float),65(float),二、 赋值转换,在,赋值时将赋值符右边值的类型转换成与其左边变量类型一致的类型。,有下列几种情况:,(1) 实型 整型(字符型):去掉小数部分;,(2) 整型(字符型) 实型: 补足有效位;,float f=23; 23.00000 f (7,位),double f=A;,65.0000000000000 f(15,位),(3)对,char、,int,、short、long、unsigned,型数据:,赋值符右边数据(,a,位) 赋值符左边的变量(,b,位),若,a=b,ab,ab,原样照赋;,截断高,a-b,位,送低,b,位;,有符号数据 有符号变量:符号扩展;,其他情况:高,b-a,位全补0。,符号扩展:,符号位为0,剩余的高位补0;,符号位为1,剩余的高位补1。,例如:,int a=2,b=5;,float x=4.4;,则有:,表达式 结果,b/a,(float)b/a,(float)(b/a),(int)x%a+x,(int)x%(a+x),三、强制类型转换,形式: (类型名)表达式,强制类型转换时,得到所需类型的中间变量,原来变量的类型不会改变。,2,2.5,2.0,4.4,本章结束,再见!,同学们:,
展开阅读全文