类型、运算符与表达式.ppt_第1页
类型、运算符与表达式.ppt_第2页
类型、运算符与表达式.ppt_第3页
类型、运算符与表达式.ppt_第4页
类型、运算符与表达式.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

1,第3章数据类型、运算符与表达式,3.1C语言基本元素3.2C的基本数据类型3.3C的运算符及表达式,2,3.1C语言基本元素,C语言的基本元素是指能构成程序和其他复杂成份的基本要素,主要有C的字符集、标识符、保留字(关键字)、常量及变量等。3.1.1C的字符集C语言中可用的字符有以下几类:(1)大小写的英文字母:A,B,Z,a,b,z;(2)阿拉伯数字:0123456789(3)特殊字符:+-*/%=_():?(4)不可打印的字符:空格,换行符,制表符。,3,3.1.2标识符标识符是某种对象的名字或标记,这些对象可以是变量名,函数名,标号等等。标识符的构成成份是:字母、数字和下划线;构成规则是:以字母或下划线开头的字符序列。对象的取名最好能直观表达该对象的意义,这样能很自然地引起联想,便于阅读和理解。比如表示圆周率可取名pi,表示求和可取名sum等。在C语言中大小写母表示不同的意义,这样sum和SUM就是两个不同的名字,甚至sum和sUm也不相同。正确的标识符:abc,_ab2,_123,total不正确的标识符:123,abc,ab*c,4,3.1.3关键字C语言中有一种特殊的标识符,它在程序中有特定的含义,用在特定的地方,不能随便移作他用。它们是C语言系统使用的,用户在定义对象名时不能使用这些标识符。这样的标识符称为关键字或保留字(32个),它们都是一些英文单词或缩写。C语言的关键字如下:autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile,5,3.1.4变量和常量1.常量常量是在程序执行过程中其值不变的量,如123,45.2,a,“abc”等,这样的常量也称为常量直接量,因为其含义是由其字面意义直接表达的。还有一种常量称为符号常量,是用一个名字来代表常量。定义符号常量的方法是用define命令把一个常量名和常量联系起来。如definePI3.1415926,6,2.变量变量是其值在程序执行过程中可以改变的量。如定义sum是个变量,则执行语句sum=0;后,它的值为0,再执行语句sum=1;之后,它的值就变为1。之所以会有这些变化,是因为变量实际上是内存中的一段存储单元,里面可以存放变化的数据。要想把内存中的某段存储单元和一个变量名联系起来,必须首先对变量进行定义或声明。,7,变量声明的一般形式是:;是C语言中可以使用的数据类型;则是由一个或多个用逗号分开的标识符即变量名组成,最后以分号结束。如:intsum,i;就定义了两个变量sum和i,它们的类型是整型。这样就在内存中开辟出两个能存放整数的存储单元,这两个单元在空间上不一定是连续的。注:若变量只声明而未赋值,默认情况下数值类型变量的初始值为0。,8,当执行语句sum=0;i=1;之后,变量sum和i的存储单元为:,如果再执行语句sum=i+2;则存储单元变为:,9,对变量必须先声明后使用的原因在于:(1)不同类型的数据在编译时分配的内存空间大小不同,如:字符型占一个字节,整型占两个字节,而浮点型占四个字节。(2)不同类型的数据在内存中的存储形式不同,如:字符型是以ASCII形式存储的,整型是以补码形式存储的,浮点型是以指数形式存储的。(3)对不同类型的数据所使用的运算符不同,比如%(求余)运算符只能用于整型变量而不能用于浮点型变量。,10,3.1.5字符串常量字符串常量在C程序中有着广泛的使用,它是用双引号括起来的字符序列。如:“string”“thisisabook”“sumis%dn”等都是字符串常量。,11,3.1.6注解为了便于对程序的功能、程序中的语句和函数等的理解,可在适当的地方加注解。注解的内容放在“/*”和“*/”之间,编译器对其中的内容作为空白符对待而不予处理。如:/*thisisauserdefinedfunction*/就是对一个自定义函数的注解。一个注解可以写多行,只要注意“/*”和“*/”前后配对即可,如:/*thisisacomment*/,12,例:注解的应用。/*thisisasingleprogram*/defineTEN10includemain()intsum;sum=2*TEN+2;/*namely:sum=2*10+2*/printf(sum=%dn,sum);程序中用到了注解和符号常量。,13,3.2C的基本数据类型,计算机可以处理多种多样的数据,这些数据有着内在的联系和差别。物以类聚,计算机中的数据也如此,C语言把具有某些共同特征的数据归为一类,以便处理。C语言作为现代化的语言有着丰富的数据类型,它既有基本类型,又有构造类型,还有指针类型和空类型。下图是C的数据类型总览。,14,图:C的数据类型总览,15,3.2.1int(整数)类型1.int类型及其扩展对不同的数据类型,编译系统会分配大小不同的内存单元以存放不同类数据,因此就决定了每一类数据必然有一定的取值范围。整型数据是整数的一个子集。在ANSIC中,基本整型占两个字节,即16位二进制位,最高位为符号位,数值位占15位,这样它的取值范围即为:-2152151即:-3276832767基本整型的标识符为int,由它可以定义整型变量:inti,j,k;则i,j,k这三个变量可以取-3276832767之间的任何整数值。,16,(1)shortint:短整型,可简写为short。其位数不比int类型长,一般和int类型一样长,数值范围也为-3276832767,在表示较小的整数时使用。(2)longint:长整型,可简写为long其位数不比int类型短,其长度规定为int类型的两倍,即4个字节,取值范围为-231231-1之间,可表示更大的整数。,17,例:求int,shortint和longint类型的长度。includemain()printf(sizeof(int)=%dn,sizeof(int);printf(sizeof(short)=%dn,sizeof(short);printf(sizeof(long)=%dn,sizeof(long);运行输出:sizeof(int)=2sizeof(short)=2sizeof(long)=4因此有如下关系:sizeof(short)sizeof(int)sizeof(long),18,(3)unsignedint:无符号整型,简写为unsigned其长度和int类型相同,但是它取消了符号位,把最高位也作为数值位使用。因为取消了符号,所以它的值全部是正的。它的取值范围:065535注:类型修饰符还包括signed2.整型数据的溢出上述各种整数类型都有各自的取值范围,一旦越出了这个范围,就不能正确地表示数据,这种情况称为“溢出”。我们先来看两个例子。,19,例:includemain()intmax,min;max=32767;min=max+1;printf(max=%d,min=%dn,max,min);,20,运行输出:max=32767,min=-32768为什么max加1以后会产生负值呢?这是因为整数在内存中是以补码形式存储的,最高位是符号位,符号位为0时表示正数,为1时表示负数,而补码运算中符号位是参与运算的:max:0111111111111111+1min:1000000000000000,符号位,21,例:includemain()intmin,max;min=-32768;max=min-1;/*max=min+(-1)*/printf(min=%d,max=%dn,min,max);,22,运行输出:min=-32768,max=32767我们可以做同样的分析,在补码表示的情况下:1000000000000000+111111111111111110111111111111111,-1的补码,32767,-32768的补码,溢出,23,3.整型常量的几种表示形式在C语言中,整型常量有三种表示形式:十进制表示,八进制表示和十六进制表示。其特征表示在数值的前缀上。(1)十进制表示:用十进制数码表示数,不加前缀。如:123,-45,0等。(2)八进制表示:用八进制数码表示数,加前缀“0”(数字零)。如:0123,0275等,而0129则为错误表示形式,因为9不是八进制数码。(3)十六进制表示:用十六进制数码表示数,加前缀0 x或0X(数字零和字母x(X)。如0 x1A,0X8F等。除了前缀以外,整型常量还可以带后缀,以明确指明该数属于什么整数类型。后缀可以是l(或L),u(或U)及其组合。l表示长整型,u表示无符号整型,组合形式有:ul,uL,Ul,UL,lu,lU,Lu,LU。,24,例:#includemain()inti;unsignedintu;longintl;i=123;u=123;l=123;printf(i=%d,u=%d,l=%dn,i,u,l);i=u+l;u=l+i;printf(i=%d,u=%dn,i,u);运行输出:i=123,u=123,l=123i=246,u=369,注:不同类型之间赋值注意溢出错误。,25,3.2.2char(字符)类型字符类型以char作为类型标识符。用char定义的变量称为字符变量,一个字符变量只能容纳一个字符。一个字符常量是用单引号括起来的字符,如a,A,*等。在内存中为一个字符变量分配一个字节的存储空间。由于一个字节的8位二进制位可以有2+8=256种不同的组合形式,因而可以有256个不同的字符。在这256个字符中,有些是可见的;有些是不可见的,它们只起控制作用,如换行、回车等。,26,1.字符在内存中的存放形式字符在内存中是以编码的形式存放的。最常用的编码方式是ASCII码。存储一个字符,实际上是把它的ASCII码放入内存中。因为在内存中都是以二进制形式表示的,因此字符型和整型之间有相通性,这些相通性表现在:(1)字符型数据可以用整型形式输出;反之,一定范围内的整数也可以用字符形式输出;(2)字符型和整型之间可以进行混合运算;(3)整型变量可以接收字符常量,字符变量也可以接收整型数值,当然这都要在一定范围之内。,27,例#includemain()inti,j;charc1,c2;c1=a;c2=b;printf(c1=%c,c1=%d;c2=%c,c2=%dn,c1,c1,c2,c2);i=97;j=98;printf(i=%d,i=%c;j=%d,j=%cn,i,i,j,j);运行输出:c1=a,c1=97;c2=b,c2=98i=97,i=a;j=98,j=b英文大小写字母之间有这样的关系:相应小写字母的ASCII码比大写字母大32。根据这一关系,我们可以将大小写字母任意转换。,28,例includemain()charc1,c2;c1=a;c2=B;printf(c1=%c,c2=%cn,c1,c2);c1=c1-32;c2=c2+32;printf(c1=%c,c2=%cn,c1,c2);运行输出:c1=a,c2=Bc1=A,c2=b,29,例:includemain()inti;charc;i=a;c=98;printf(i=%d,c=%dn,i,c);printf(i=%c,c=%cn,i,c);运行输出:i=97,c=98i=a,c=b一个字符在内存中占一个字节,对这个字节的最高位,不同的系统有不同的处理方法。,30,例:includemain()charc=199;printf(c=%d,c=%cn,c,c);输出为:c=-57,c=,31,2.字符常量我们已知字符常量是用单引号括起来的字符,这对于可显示字符来说很容易表示,但对控制字符怎样表示呢?在C语言中没有相应的直接形式显示这些字符,但可以换一种形式来表示它们,即用转义字符来表示。转义字符是以反斜杠开头,后面加其他字符。反斜杠的作用是把后面的字符赋以新的含义(即转义)。以开头定义的字符有三种情况:非显示字符(控制字符);可显示字符;字符的数值表示。如下表所示。,32,表:C的转义字符及其含义,33,例:includemain()printf(“Thisisaprogramn“);printf(“thisisba012programn“);printf(“firstsecond“);运行输出:Thisisaprogramhisiaprogram“firstsecond“其中,“t”是水平制表符,“b”是退格符,“012”和“n”都是换行符。要想输出“”,必须写成“”;要想输出“”,必须写成“”。,34,3.字符和字符串前面已指出,字符串是用双引号括起来的字符序列。字符和字符串有着本质的区别:(1)字符用单引号括起来,而字符串用双引号括起来;(2)单引号括起来的只有一个字符,而双引号括起来的有多个字符。,35,3.2.3float和double类型1.浮点型数据的两种表示形式对一个实型常量,可以用两种形式表示它,即十进制小数形式和指数形式。(1)十进制小数形式,如123.45,-0.001。(2)指数形式,其组成格式为:e(或E)其含义为:10这几部分的书写规则是:(1)尾数部分不能省略,即e(或E)前必须有数据;(2)指数部分必须是整数;(3)尾数可以只有整数部分或只有小数部分;(4)指数、尾数都可以带符号,如省略符号则隐含为正。,36,2.浮点型变量的分类浮点型变量分单精度(float)、双精度(double)和长双精度(longdouble),它们的长度、精度及取值范围如下表所示。,表:不同类型实型变量的长度、精度和取值范围,37,3.2.4变量赋初值前面已介绍了三种数据类型,用类型名可以定义相应的变量。根据先定义后使用的原则,在定义变量之后,可以对它进行处理。如:inti,j;i=3;j=3;通过赋值语句,使i,j具有数值3。我们还可以把二者结合起来,即在定义变量的同时就让它有一个值,这就是变量赋初值,如:inti=3,j=3;程序可以对i,j的当前值进行运算,当然这些值在以后是可以改变的。,38,3.3C的运算符及表达式,C语言不仅数据类型丰富,运算符也十分丰富,几乎所有的操作都可作为运算符处理。由运算符加适当的运算对象可构成表达式,而表达式是C程序的重要要素之一,因此掌握好运算符的使用对编写程序是十分重要的。,39,3.3.1算术运算符1.基本的算术运算符C语言中基本的算术运算符有:+、-、*,/,%,其含义如下表所示。,在算术运算符的使用中有以下两点需要注意:(1)除法运算符“/”的结果和其运算对象有关。(5/2=2、5.0/2=2.5)(2)求余运算符“%”要求其运算对象都必须是整数,但可正可负。,40,例:includemain()printf(5/3=%d,-5/+3=%dn,5/3,-5/+3);printf(3/5=%d,3./5=%fn,3/5,3./5);printf(10%3=%d,-10%3=%d,10%-3=%d,-10%-3=%dn,10%3,-10%3,10%-3,-10%3);运行输出:5/3=1,-5/+3=-13/5=0,3./5=0.60000010%3=1,-10%3=-1,10%-3=1,-10%-3=-1注意:要输出一个百分号%,在控制串中必须有两个连续的百分号%。,41,2.算术运算符的优先级和结合性C语言中算术运算符的优先级和代数学中的规定是一样的,并且都是从左向右结合的,算术运算符的优先次序如下表所示。,42,3.3.2自加(+)自减(-)运算符C语言中有两个特殊的算术运算符,即自加、自减运算符(+和-)。这两个运算符都是单目运算符,它们既可以放在运算对象之前,也可以放在运算对象之后,形成前置形式和后置形式,而运算对象也只能是整型变量。不管前置还是后置,其运算结果都是一样的,都是把运算对象的值增加1或减少1。设有整型变量i:+i,i+都使i值增加1-i,i-都使i值减少1例如:inti,j=2;则下面运算的结果是i等于3,j也等于3。i=+j;而下面的运算结果是i等于2而j等于3:i=j+;,43,使用自加、自减运算符应注意以下几点:(1)最常见的错误是把自加自减运算符用在非简单变量的表达式上,如+(x+2),+(-i)等都是错误的。(2)自加自减运算符的结合性是自右向左的。(3)如果两个运算对象之间连续出现多个运算符时,C语言采用“最长匹配”原则,即在保证有意义的前提下,从左到右尽可能多地将字符组成一个运算符。(4)因字符类型和整型是相通的,故对字符变量也可以进行自加、自减运算。,44,例:includemain()intp,x=3;charc=a;p=-x+1;printf(p=%d,x=%dn,p,x);printf(c=%cn,+c);运行输出:p=-2,x=4c=b,45,3.3.3赋值运算符要使一个变量得到值或改变它的值,除了可以用scanf函数输入外,也可以很方便地用赋值运算符实现。前面我们已介绍过赋值运算符的基本使用,现在做进一步的说明。1.一般的赋值运算符在C语言中,赋值运算符为=,由它可以构成赋值表达式:=如:inta=5,b=6;a=b+3;b=a-2;,46,2.赋值运算中的类型转换如果赋值运算符两边的类型不一致,则在赋值的时候要对右边表达式的类型进行转换,使之适应左边变量的要求,或者说用左边变量的类型去剪裁改造右边的表达式。为了便于表达,我们做如下的约定:类型1(类型2)表示把类型2的值赋给类型1的变量。具体地有以下几种情况:(1)int(float,double)只取float,double的整数部分,但当float,double的整数超过int所表示的范围时,将出现数据错误。,47,(2)float(int)double(int)变量中的整数部分是右边表达式的值,而小数部分是相应个数的0。如:floatf=15;doubled=15;则有:f=15.000000(6个0)d=15.000(14个0),48,(3)float(double)在float类型所能容纳的范围之内,把double数值的前7位放入float型变量中,超过范围则出错。double(float)在double变量中,有效位数扩展到16位,数值不变。,49,(4)int(unsignedchar)int类型占2个字节,char类型占一个字节,赋值是把字符放入整型变量的低8位,高8位全部补0,以保证是个正整数。例如:inti;unsignedcharc=376;i=c;,50,(5)char(int,shortint,longint)此时只把整数的低8位送到字符变量中,其余全部截掉,如整数大于255(低8位的最大值)时,赋值在变量中会改变原来的值,如:inti=256;charc=i;printf(i=%d,c=%dn,i,c);则输出为:i=256,c=0,51,(6)long(int)把int类型数值送入long类型的低16位中,高16位按“符号扩展”的原则处理。int(long)把long的低16位送入int型变量,高16位截掉,如高16位中仍有数据,则变量中有可能改变原来的值。,52,(7)int(unsignedint)long(unsignedlong)short(unsignedshort)这类赋值的特点是两边的长度相等,但取值范围不同,右边的正数范围要比左边大一倍,因此只有在左边的正数范围内赋值才正确,否则所赋的正值在变量中会得到负的结果。,53,(8)unsignedint(int)unsignedlong(long)unsignedshort(short)这是和(7)相反的赋值,可以照原值全部传送,但若传送负数,则接收者会得到一个正数的结果,其原因在于把原来的符号位此时也当成了数值位。例如:unsignedinta;intb=-1;a=b;printf(b=%d,a=%dn,b,a);则输出为:b=-1,a=65535,54,回顾,55,120、-100、0;0120、072;0 xFFFF、0 x1e、0X28AF,0XED4;120L,200L;长整型常量3.14、-3.1、5.12E-6;a、#、n、101;099、12f、0 xg、48EA;019.5、1e-08;实型常量只能用十进制形式表示2.1E10.2、E-6、6.4E+4.8、E9;changsha、+?ab;、p、ab;,直接常量:是在程序中直接引用的数据。,请判断这些常量正确与否:,56,变量初始化在定义变量的同时给变量一个初始值。,inta=5,b=3;inta=b=c=3;inta,b,c;a=b=c=3;,运算符:就是表示某种运算功能的符号。按操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符、逗号运算符以及按位运算符等。,表达式:是由操作数和运算符组成的序列。如:1+2*3-4、35-7、a=b%2等都是C语言中的表达式。,57,%(取余)(注意:取余运算的操作数只能是整数,且结果的符号与前一操作数的符号相同),算术运算符和算术表达式,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整除,58,等价于:j=i;i+;所以i的值为4,j的值为3,等价于:i+;j=i;所以i的值为4,j的值为4,(1)i=3;j=i+;(2)i=3;j=+i;,自增与自减运算符(+、-),+i,-i:使用之前使i的值增1(或减1);,i+,i-:使用之后使i的值增1(或减1);,分析下面几种情况中i与j的值:,当+、-不与其他运算符混合使用时,+i与i+都等价于i=i+1,-i与i-都等价于i=i-1,59,如: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,60,1、6种关系运算符:=!=2、关系表达式:用关系运算符将表达式连接起来的式子优先级:(=)(=!=)结合性:自左至右;表达式的值:若为真,则结果为1;若为假,则结果为0。,35值为:32值为:设x=-2;-3x-1值为:设x=1;2x4值为:,例如,关系运算符和关系表达式(第五章5.1),求如下关系表达式的值:,0,0,0,1,算术运算符优先级高于关系运算符3+(4关系max=ab?a:b求max的值,max的值为5,71,逗号运算符逗号在C语言中主要起两个作用,一是作为分隔符,一是作为运算符。1.逗号分隔符在变量的定义和函数的参数中都用到了逗号分隔符。如:inti,j,k;charc1,c2,c3;result=max(a,b);这里它的作用是把同类型的变量名分开,把函数的各个参数分开。,72,2.逗号运算符作为运算符,它是把两个对象“连接起来”,使之成为一个逗号表达式。其一般形式是:,求值规则:从左至右依次计算各表达式的值;优先级:最低;结合性:自左至右;表达式的值:最后一个表达式的值。例如:i=1,j=0,sum=0,m=2*i+3是一个由四个赋值表达式构成的逗号表达式,此表达的值是m的值。,73,例如:aby表达式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,74,形式有两种:sizeof()或sizeof结果为整型数。,inta;floatx;printf(“%d,%d”,sizeofa,sizeofx);printf(“%d,%d”,sizeof(int),sizeof(float);以上两个printf语句结果均为。,例如,3、求字节运算符:sizeofsizeof是一个单目运算符,作用:求得变量或某种数据类型所需的字节数。,2,4,其中运算对象可以是数据类型名、变量名、常数名等。变量、常量的大小实际上是它所属类型的大小。虽然sizeof的使用像是一个函数调用,但它只是个运算符,不是函数,它没有函数调用方面的开销,75,C语言允许整型、实型、字符型数据进行混合运算。有3种转换方式:自动转换、赋值转换和强制转换。一、类型自动转换,数据类型转换,特点:由数值存储位数少的向多的转换;整型向实型转换!操作数为相同类型的不转换,仍取原类型。,76,intx=2;floaty=1.6;charc=A;则:c+1/x*y=,例

温馨提示

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

评论

0/150

提交评论