C语言第二章数据、运算.ppt

上传人:za****8 文档编号:13189347 上传时间:2020-06-06 格式:PPT 页数:96 大小:516.51KB
返回 下载 相关 举报
C语言第二章数据、运算.ppt_第1页
第1页 / 共96页
C语言第二章数据、运算.ppt_第2页
第2页 / 共96页
C语言第二章数据、运算.ppt_第3页
第3页 / 共96页
点击查看更多>>
资源描述
第二章数据、运算符和表达式,常量、变量以及函数等都是程序的基本操作对象,统称为数据。根据数据的取值范围以及能在其上所进行的运算,可把数据分为各种类型,不同类型的数据一般在内存中占用不同的存储空间,同时,数据的类型不同,能够参加的运算也不同。语言中的数据类型非常丰富,大体上可划分为基本的数据类型和导出的数据类型两种,基本数据类型主要包括整型、字符型和单双精度浮点型等;导出数据类型是在基本数据类型的基础上产生的,其中包括数组、结构等。,本章主要讨论语言中的一些基本概念,如变量、标识符等,同时详细说明语言中的几种基本数据类型、算术运算符、关系运算符、逻辑运算符以及利用这些运算符来构成相应表达式的一些规则。,2.1基本概念,2.1.1标识符,标识符:是指用来标识程序中用到变量名、函数名、类型名、数组名、文件名以及符号常量名等的有效字符序列。,在语言中,标识符的命名规则是:由字母(大、小写皆可)、数字及下划线组成,且第一个字符必须是字母或下划线。,合法的标识符名:,year,Day,ATOK,x1,_CWS,_change_to,不合法的标识符名:,#123,.COM,$100,1996Y,1_2_3,在语言中,大写字母和小写字母是有区别的,即作为不同的字母来看待。如标识符RAN、Ran和ran分别表示三个不同的标识符,这一点同其它高级语言是有区别的,应引起注意。,2.1.2常量,常量:又称常数,是指在程序运行过程中其值不能被改变的量。常量也分为不同的类型,这是由常量本身隐含决定的。,符号常量:为了增加程序的可读性,可以用一个名字(字符序列)来代表一个常量,此时的常量被称为符号常量。,2.1.3变量,变量:是指在程序运行过程中其值可以被改变的量。变量被区分为不同的类型,不同类型的变量在内存中占用不同的存储单元,以便用来存放相应变量的值。,组成变量名(标识符)的有效字符数随语言的编译系统而定。有的编译系统允许使用长达31个字符的变量名,而有的编译系统只取变量名的前8个字符作为有效字符,后面的字符无效,不被识别,这样,只要变量名的前8个字符相同,就被认为是同一个变量。因此,在进行程序设计之前,应首先了解所使用的编译系统中对变量名长度的规定,以免造成变量使用上的混乱。,2.1.4关键字,关键字:又被称为保留字或保留关键字,也是语言中的一种标识符,它被用来命名语言程序中的语句、数据类型和变量属性等。,作用:被用来命名语言程序中的语句、数据类型和变量属性等。每个关键字都有固定的含义,不能另作其它用途。,注意:语言中的所有关键字都是用小写字母来表示的。,2.2基本数据类型,在语言中,最基本的数据类型只有四种,它们分别由如下标识符进行定义:,int整型char字符型float单精度浮点型double双精度浮点型,语言规定,对程序中用到的所有变量,都必须先定义后使用,每个变量只能与一种数据类型相联系。在定义变量时,不能把语言中具有固定含义的关键字(如int、char等)作为变量名,同时,同一个函数内所定义的变量不能同名。,2.2.1整型变量及其常量,1.整型变量,整型变量:可用来存放整型数据(即不带小数点的数)。,其定义方式如下所示:,inti1,i2;,其中i1和i2即被定义为整型变量。,2.整型常量,在语言中,整型常量可以用三种数制来表示:,(1)十进制整型常量:如250,-12等,其每个数字位可以是09。,(2)十六进制整型常量:如果整型常量以0 x或0X开头,那么这就是用十六进制形式表示的整型常量。例如,十进制数的128,用十六进制表示为0 x80或0X80,其每个数字位可以是09、AF。,(3)八进制整型常量:如果整型常量的最高位为0,那么它就是以八进制形式表示的整型常量。例如,十进制数的128,用八进制表示为0200。需要注意的是,八进制数中的每个数字位必须是07。,2.2.2浮点型变量及其常量,1.浮点型变量,在语言中,把带有小数点的数称为浮点数,也可以称为实型数。,浮点型变量又被称为实型变量,按其能够表示的数的精度,又被分为单精度浮点型变量和双精度浮点型变量。,单精度浮点型变量的定义方式如下所示:,双精度浮点型变量的定义方式如下所示:,floatf1,f2;,其中f1和f2即被定义为单精度浮点型变量。,doubled1,d2;,其中d1和d2即被定义为双精度浮点型变量。,单精度浮点型变量和双精度浮点型变量之间的差异,仅仅体现在所能表示的数据的精度上,如果单精度浮点型所提供的精度不能满足要求时,则可以考虑使用双精度浮点型。,在不同的系统中,float型数据和double型数据所能提供的精度是有差异的,一般来讲,在同一个系统中,double型变量值的最大有效位数,通常是float型的两倍。,2.浮点型常量,浮点型常量一般不分float型和double型,任何一个浮点型常量,既可以赋给float型变量,也可以赋给double型变量,但由于float型变量和double型变量所能表示的数的精度不同,所以,在赋值时,将根据变量的类型来截取相应的有效位数。,浮点型常量有如下两种表示形式:,(1)十进制数形式:它是由数字和小数点组成的,例如,3.14159,-7.2,9.8等都是用十进制数的形式表示的浮点数。,(2)指数法形式:指数法又称为科学记数法,它是为方便计算机对浮点数的处理而提出的。例如,十进制数的180000.0,用指数法可表示为1.8e5,其中1.8被称为尾数,5被称为指数,字母e也可以用E来表示。又如,0.00123可表示为1.23E-3。需要注意的是,用指数形式来表示浮点数时,字母e或E之前(即尾数部分)必须有数字,且e后面的指数部分必须是整数,例如,e-3,9.8e2.1,e5,.e3,e等都是不合法的指数表示形式。,2.2.3字符型变量及其常量,1.字符型变量,charc1,c2;,字符型变量用于存放一个单个字符。它的定义方式如下所示:,其中c1和c2即被定义为字符型变量。,2.字符型常量,字符型常量是由一对单引号括起来的一个字符,例如,A,*和8等都是合法的字符型常量。,在语言中,还允许使用一些特殊形式的字符型常量,这些字符型常量都是以反斜线字符开头的字符序列(又称为转义字符)。常用的以字符开头的特殊字符:,n:换行字符(回车换行)r:回车字符(光标返回本行第一列,但不删字符)b:退格字符(后退一列,但不删字符)t:制表字符(横向跳格,输出8个空格):单引号字符:双引号字符:代表一个反斜线字符,除了上述具有特殊意义的字符外,语言还允许在字符后面紧跟13位八进制数或在x后面紧跟12位十六进制数来表示相应系统中所使用的字符的编码值。使用这种表示方法,可以表示字符集中的任一字符,包括某些难以输入和显示的“控制字符”,ASCII码表中编码值小于0 x20的字符就属于这一类字符。例如,响铃字符(bell),在ASCII码表中的编码值为7,在程序处理过程中,为了发出响铃声音,可通过显示7(07或007)码来获得响铃效果。,需要注意的是,上面介绍的由开头的特殊字符,仅代表一个单个字符,而不代表多个字符,它仅代表相应系统中的一个编码值。,3.字符串常量,字符串常量:是由一对双引号括起来的字符序列。,从表面上看,string是由6个字符组成的,但实际上它是由7个字符组成的,这是因为在语言中,系统自动地在每个由双引号括起来的字符串的最后补上0字符,即ASCII码值为0的字符。因此,语言中的每个字符串都是以0为结束标志的。,例如,string,需要注意的是,不能将字符串常量赋给一个字符型变量,如果要保存字符串常量的话,需要使用以后介绍的字符数组来存放。,2.2.4长整型、短整型和无符号整型,上面已经介绍了四种基本数据类型,它们是int、char、float和double。语言在int型的基础上又发展了三种基本数据类型,它们是长整型、短整型和无符号整型,分别用longint、shortint和unsignedint来表示。同时还有unsignedshort和unsignedlong类型。,1.长整型,长整型变量的定义方式如下所示:,longintlv;,其中lv是长整型变量,关键字int可以省略。,使用长整型变量的目的是为了存放比较大的整数。长整型变量能够表示的数值范围与计算机系统有关,一般是int型变量有效位数的两倍,int变量如果占两个字节,则longint变量可能占4个字节,这样,长整型变量所能表示的数值范围,将远远超过一般整型变量所能表示的范围。,在整型常量的末尾加上字母L或l,就构成了长整型常量。这种写法往往用在函数实参中(如果函数的形参为longint,则要求实参也为longint,此时用123作参数不行,而要用123L作参数)。,可将987654写成987654L或987654l。,例如,2.短整型,短整型变量的定义方式如下所示:,shortintsv;,其中sv是短整型变量,关键字int可以省略。,短整型变量用于存放比较小的整型数,使用短整型的目的是为了节省计算机的内存空间,但一个短整型变量所占的内存字节数与相应的系统有关,在有的计算机系统中,短整型变量所占用的存储空间少于整型变量所占用的存储空间,但在有的系统中,shortint变量和int变量占用相同的内存空间。,短整型常量与一般的整型常量没有明显的区别,其区别仅仅在于所能表示的数值大小而已。在有的PC机上,短整型变量和整型变量都占用两个字节的内存空间,因此,所能表示的数值大小也完全一样,即-3276832767之间。,要将123赋给短整型变量sv,则需要使用如下语句:sv=123;,例如,3.无符号整型,无符号整型变量的定义方式如下所示:,unsignedintuv;,其中uv是无符号整型变量,关键字int可以省略。,一个整型常量后面加字母U或u,就被认为是unsignedint型,如12345u在内存中按unsignedint规定的方式存放(最高位不作为符号位,而用来存储数据),如果写成-12345u,则将其转换为补码存储。,无符号整型变量主要用于存放非负整型数,由于这种变量与int型变量占用相同的内存空间,因此,它能够存放的正整数范围将大于int型变量所能存放的正整数范围。,无符号整型常量总是大于等于0的正整数。在有的PC机上,无符号整型常量的数值范围一般为065535之间。例如,要将100赋给无符号整型变量uv,则需要使用如下语句:uv=100;,2.2.5类型定义typedef,语言提供了许多标准类型名,如上面介绍的int、char和float等,用户可以直接使用这些类型名来定义所需要的变量。同时,语言还允许使用typedef语句来定义新的类型名,以取代已有的类型名。,例如:,typedefintcounter;,其作用是定义counter来等价于基本数据类型名int,以后,就可以利用counter来定义int型变量了。,例如:,counteri,n;,使用类型定义的优点是能够增加程序的可读性。由上述语句可以看出,当用counter来定义i、n变量时,就可以判断出i、n变量的作用可能是当计数器使用,但如果用int来定义的话,就难以看出这种用途。,其等价于:,inti,n;,使用typedef语句需要注意如下几个问题:,(1)typedef语句不能创造新的类型,只能为已有的类型增加一个类型名,这也就是说原有的类型名仍然可以使用。,(2)typedef语句只能用来定义类型名,而不能用来定义变量。,2.3算术运算符、赋值运算符及其表达式,语言的运算符很多,本节主要介绍算术运算符、赋值运算符及其相应的表达式。,2.3.1算术运算符和算术表达式1.加、减、乘、除及取模运算符,语言中的加、减、乘、除及取模运算符分别由+、-、*、/及%来表示。,21%7的结果是0,21%5的结果为1。,-100(表示负100);,其中减法运算符也可以作为负值运算符使用,取模运算符又被称为求余运算符,要求%的两侧必须为整型数,它的作用是取两个整型数相除的余数。,优先级:,一个表达式中如果有多个运算符,则计算是有先后次序的,这种计算的先后次序被称为相应运算符的优先级。,*、/、%运算符的优先级高于+、-运算符的优先级。,结合性:,除了优先级以外,语言中还规定了相应运算符的结合性。所谓结合性,是指当一个运算对象(操作数)两侧的运算符的优先级相同时,进行运算(处理)的结合方向。,在表达式求值时,先按运算符的优先级别高低次序执行,例如a-b*c,先乘除后加减。如果在一个运算对象两侧的运算符的优先级相同,如a-b+c,则需要按规定的“结合方向”处理,由于算术运算符的结合方向为“自左至右”,即先左后右(即左结合性),因此,b先与减号结合,执行a-b运算,再执行加c的运算。有些运算符的结合方向是“自右至左”,即右结合性(如赋值运算符),详见附录。,说明,在语言中,算术运算符的结合方向为自左至右,即运算对象先与左面的运算符结合,而有的运算符的结合方向是自右至左。例如,赋值运算符。,语言对运算符的优先级及其结合性的规定是比较复杂的,初学者往往会感到不适应,附录中列出了每个运算符的优先级及其结合性。,算术表达式,由算术运算符和圆括号将运算对象连接起来的有意义的式子被称为算术表达式。在表达式中,使用左、右圆括号可以改变运算的处理顺序,由于圆括号的优先级最高,因此,圆括号里的运算总是最先进行的。,例如:,x=a*(b+c);,注意:先计算括号里b+c的值,然后乘以a,并把结果赋给变量x。,2.增1、减1运算符,增1、减1运算符是语言特有的运算效率较高的运算符。,增1运算符+和减1运算符-是两个单目(只有一个运算对象)运算符,它们的运算对象只能是整型或字符型变量,而不能是浮点型变量。增1运算符是将运算对象的值增1;减1运算符是将运算对象的值减1。它们既可以作前缀运算符(位于运算对象的前面),也可以作后缀运算符(位于运算对象的后面)。,例如:,尽管+n和n+都使n的值自增1,但其结果是有区别的:+n表示在用该表达式的值之前使n的值增1;n+表示在用该表达式的值之后使n的值增1。同样,-n表示在用该表达式的值之前使n的值减1;n-表示在用该表达式的值之后使n的值减1。因此,在使用增1和减1运算符时,必须要注意变量的值和表达式的值在程序上下文中的效果。,作前缀运算符,+n,-m,作后缀运算符,n+,m-,例如:,显然,对于变量n来讲,上述两个语句的结果是一样的,都使n的值减1,而对于x的值来讲就不同了,要引起注意。,注意:,使用增1、减1运算符进行运算时,注意两个问题:一是增1、减1运算符只适用于变量,而不能用于常量或表达式,如-5和(i+j)+等都是非法的;二是在只需对变量本身进行增1或减1操作而不关心整个表达式的值的情况下,前缀运算和后缀运算的效果完全相同。,合理地使用增1、减1运算符,对于编写高质量的语言程序是非常有用的,它的简洁表示形式,对于以后要介绍的结构控制语句以及指针运算等都将带来很大的方便。,优先级顺序如下(由高到低):-(负号)、+、-高于*、/、%高于+、-,-(取负)、+和-的结合方向为右结合,+-*/和%的结合方向为左结合。当运算符+、-和运算符+、-进行混合运算时,C语言规定,自左至右尽可能多的将若干字符组成一个运算符。例如(假如i=2,j=3)(1)i+j等价于(i+)+j计算后表达式值=5,i=3,j=3(2)-i+等价于-(i+)计算后表达式值=-2,i=3,j=3-i+j等价于-(i+)+j计算后表达式值=1,i=3,j=3,下面的运算是错误的:+i+j;+i+;(-i)+;,2.3.2赋值运算符和赋值表达式,语言的赋值运算符是“”,它的作用是将赋值运算符右边的表达式(包括算数表达式、关系表达式和逻缉表达式)的值赋给其左边的变量。,例如:x=a+b的作用是将a+b的结果赋给变量x。,为了简化程序并提高编译效率,语言允许在赋值运算符“=”之前加上其它运算符,以构成复合赋值运算符。,例如:,凡是二元(有两个运算对象)运算符,一般都可以与赋值运算符一起组成复合的赋值运算符。,+=,-=,*=,/=,%=,例如:,都是合法的复合赋值运算符。,2.4关系运算符、逻辑运算符及其表达式2.4.1关系运算符和关系表达式,关系运算是逻辑运算的一种简单形式,主要用于比较操作。,1.关系运算符,大于=大于等于=等于!=不等于,注意:不要把关系运算符的“=”和赋值运算符的“=”搞混淆了。“=”是关系运算符,仅用于比较操作,而没有赋值运算,而“=”是赋值运算符,它主要进行赋值操作。,由附录可知,关系运算符的优先级低于算术运算符的优先级,且上述后两种关系运算符(=和!=)的优先级低于前四种关系运算符的优先级。,2.关系表达式,由关系运算符将两个表达式连接起来的有意义的式子称为关系表达式。,例如:,xy,a+by为“真”时,其表达式的值为1;当xy为“假”时,其表达式的值为0。,可以将关系表达式的运算结果(0或1)赋给一个整型变量或字符型变量。,例如:,c=ab;,当a=4,b=1时,上面的赋值语句是将1赋给变量c:,2.4.2逻辑运算符和逻辑表达式,为了表示比较复杂的条件,需要将若干个关系表达式组合起来判断,语言提供的逻辑运算就是用于实现这一目的的。,1.逻辑运算符,语言中提供了如下三种逻辑运算符:,它表示定义整型变量age,同时将初值20赋给它,初始化方式,charletter=A;intconvert=b-B;floataverage=3.2*9.8;,x、y、z三个整型变量都赋以初值10:,同时定义的多个变量的一部分赋初值:,intx=10,y=10,z=10;,floatpx,py,pi=3.1416;,它表示px、py、pi都是浮点型变量,但只对变量pi赋以初值3.1416,而其余的变量(px和py)没有被显式地赋以初值。,2.6不同类型数据之间的转换,在内存中,字符是以系统中所使用的字符的编码值形式存储的,比如,在有的PC机上是以ASCII码形式存储的,它的存储形式与整型数的存储形式相似。语言允许字符型数据和整型数据之间通用:一个字符型数据,既可以以字符形式输出,也可以以整数形式输出(有关输入输出部分将在以后介绍),同时,字符型数据可以赋给整型变量,整型数据也可以赋给字符型变量,只是当整型数据的大小超过字符型变量的表示范围时,需要截取相应的有效位数。,除了上述字符型数据和整型数据之间可以通用之外,不同类型的数据在进行混合运算时,往往需要进行类型转换。这种类型转换有两种方式:一种是自动类型转换,另一种是强制类型转换。,2.6.1自动类型转换,语言允许整型、单精度浮点型和双精度浮点型数据之间进行混合运算,由于字符型数据可以和整型数据通用,所以,下列表达式是合法的:B+3.14*560-92,自动类型转换的顺序如下:,double,unsignedlongint,int,float,unsignedchar,char,unsignedshort,short,说明:float型先转换为double型后运算,即使两个float运算也是先转化。char和short型先转换为int型后运算其他由低向高转换。,unsignedint,longint,转换方向(不是转换步骤),整型数据和浮点型数据之间的自动转换规则:,(1)当单、双精度浮点型数据赋给整型变量时,浮点数的小数部分将被舍弃。同时,由于浮点型变量所能表示的数的范围远远超过整型变量的表示范围,所以,在赋值时,还需进行相应有效位数的截取操作。,(2)当整型数据赋给浮点型变量时,在数值上不发生任何变化,但整型数据将被转换成浮点型数据的形式后,存储到浮点型变量中。,(3)如果某个算术运算符的两个运算对象都是整数,那么,运算将按照整型数的运算规则来进行,这就意味着对除法运算来讲,其结果的小数部分将被舍弃。需要注意是,在这种情况下,即使运算结果赋给了浮点型变量也是一样的,结果的小数部分也将被舍弃。,floatf;inti=4;f=10/i;,例如:,此时,f的结果为2.0,而不是2.5。,(4)只要某个算术运算符的两个运算对象中有一个是浮点型数据,则运算将按照浮点数的运算规则来进行,即结果的小数部分也被保留下来。,floatfinti=4;f=10.0/i,例如:,此时,f的结果为2.5,而不是2.0。,2.6.2强制类型转换,当自动类型转换达不到目的时,可以利用强制类型转换。,当除法运算符“/”的两个运算对象都是整型数据时,其运算将按照整型运算规则来进行,即舍弃结果的小数部分,如果希望按照浮点型运算规则来运算的话,就必须首先把其中某个运算对象的数据类型强制转换为浮点型,然后再进行运算。,例如:,强制类型转换的一般形式如下所示:,(类型名)(表达式),例如,(float)x/y是将x强制转换成float型后,再进行运算。,(int)(x+y)是将x+y的结果强制转换成int型。,注意,在进行强制类型转换时,需要将类型名用小括号括起来,同时,经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型及其数值大小并没有发生任何变化。,intx,y;floatz;z=(float)x/y;,例如:,将变量x的类型强制转换为float型后参加运算,但x的数据类型并没有发生变化,仍然是int类型。,2.7sizeof运算符,在程序设计过程中,有时需要了解一个变量或某种类型的量在内存中所占的字节数,sizeof运算符就是用于这一目的的。,sizeof运算符有两种用法:,当x是整型变量时,sizeofx的值是2,它表示在内存中占2个字节。,(1)sizeof表达式(或:sizeof(表达式)其运算结果是得到表达式计算结果在内存中所占用的字节数。,例如:,(2)sizeof(类型名)其运算结果是得到某种类型的量在内存中所占用的字节数。这里”类型名”必须由小括号括起来。,sizeof(float)的值是4,它表示float型变量在内存中占4个字节。,例如:,例如:,x=sizeof(float)-2;printf(%d,sizeof(double);,sizeof运算符可以出现在表达式中,2.8应用举例,【例2.1】编一程序,定义两个整型变量并为其初始化,同时将其相加之和显示出来。,#includestdio.hvoidmain()intx=10,y=100,z;z=x+y;printf(z=%d,z);,【例2.2】从键盘输入一个整数,并将其值加1后显示出来。,#includestdio.hvoidmain()intx;scanf(%d,【例2.3】从键盘输入三个整数,分别存入x、y、z三个变量中,并将(x+y)z的结果显示出来。,#includestdio.hvoidmain()intx,y,z,result;scanf(%d%d%d,2.4设有变量说明intx,y;下面是一些数学断言和对应的C语言表达式。(1)x与y的个位数相同x%10=y%10(2)x和y至少有一个等于零x*y=0(3)x的个位数和十位数相等x%10=x/10%10(4)xa,b)x=a&x0&y0)(6)x是1000以内的非负奇数x=0&x1000&x%2=1,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!