1、单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,上一章内容回顾,C,语言中的基本符号集,关键字,标识符,简单的,C,程序,#include“,stdio.h,”,void main(),第2章,C,语言基础,1,C,语言中的数据和数据类型,运算符,表达式,语句,数据输入/输出语句,思考,1,1,、现有两个,容积相等,的容器,X,和,Y,,里面装的都是,水,(水的多少不一),如何将两个容器里的水交换?,需要借用一个容积相同的容器,比如,Z,思考,2,2,、上一题中,假设是两个,容积不相等,的容器,X,和,Y,,能否交换?,思考,3,3,、现有两个容器,一个
2、水瓶,和一个,竹篮,,水瓶里装的是水,竹篮里装的是石头,两个容器里的东西能否交换?,2.1,.1,数据类型,这是个有类型的世界1/3,问题1,:,现实生活,有哪些信息可以用计算机可以管理呢?,职工、学员、客户、工资、原材料、产品、商品现实中实现用计算机管理的信息已是无数。,问题2,:,职工又有什么信息呢?,职工有姓名、性别、出生年月、家庭住址、电话,婚否、工龄、工种、工资、等等。,这两个问题你可能回答得不错,现在,考验你前面有没有认真学习的时刻到了,请看下面这个问题:,所有的这些信息,在计算机里都是以什么样的数据形式来表达呢?,请自觉闭上眼睛,想一想。,这是个有类型的世界2/3,再看以下的各
3、种回答。,“二进制数”,,正确,。,“已数字化的数据”,也算,正确,。,“0和1”,,正确,。,“机器语言”,,正确,,你还记得以前讲过的内容啊,不错。,本章需要继续的一个问题就由此开始:,所有的信息都用机器语言那些0和1表达,那你我编写程序岂不很难?,这是个有类型的世界3/3,数据类型,就是计算机语言向人类语言靠近时,走出的第一步,很重要的一步。(机器语言或汇编语里,没有数据类型一说。),人类的世界,是有类型的世界。,树木花草,归一类:植物;,猪狗猫羊,动物;,金银铜铁,金属;,你我他她,人类。(不要告诉我你不是人类,在这虚拟的网络的世界),如果你找一个人,对他说:“,你等于一块臭石头,”,
4、他一定暴跳如雷。为什么呢?学了这一章,我们就可以从程序的角度来解释了:,人和石头不是一类型,不适于做赋值操作。,上帝创造世界时,是不允许人“类”变为石头“类”的。,(想和上帝做同行?快做个程序员吧。),理解数据类型,“数据类型”就是这么一个很好理解的概念。我们的重点是了解在计算机编程世界中,有哪些基本的数据类型?在人类世界里,数据类型那就多了,把人类的对万物划分类型的方法照搬入计算机世界,显然不可能。怎么办呢?方法就是:抽象。,计算机先哲们为我们做了这一切。其中,最重要类型,也称为,C/C+,语言的基本数据类型,只有两个:“数值”和“字符”。,第一是,“,数值型,”。在职工的信息中,譬如,年
5、纪,,,工龄,、,工资,就有了归属。,第二是“,字符型,”。像,职工姓名,或,家庭住址,,这些由字符类型的数据组成。,你可能想不到的还有,职工的,电话号码,010-1234567,这也是由字符类型数据组成。0、1、2、3不是数字吗?应该属于上面的“数值”类型吧?-把两个电话号码进行相加或相减的操作是没有意义的。,在,C/C+,中,“字符类型”其实也可归入数值类型。在某些情况下,它仍然会被用来参与计算。比如在计算机中,字符,A,加1后,会得到下一个字符,B,,这种操作符合我们的习惯。,理解数值型:整型和实型1/2,“数值类型又被分为“整型(,int,)”,和“实型(,float)”。,整型就是不
6、带小数位的数,而实型则是指带小数位的数,也称为“浮点数(,float)”。,我们在生活中一般并不做如此区分。譬如说鸡蛋的价格罢,今儿便宜了,一斤2块整,但这不防碍明儿价涨了,我们说成:涨了,2.30元一斤。在编程时可不能这样,你必须事先考虑到鸡蛋的价格是必须带小数的,就算现在是2块整,也得将价格定为实型,否则,涨成2块3时,计算机会把那0.3元给丢了,还是变成2元整。,你会问:,为什么不直接就定一个实型就好呢?实型不就包含了整型的值吗(如2.0等于2元)?,理解数值型:整型和实型2/2,答案很简单:因为在计算机里,,对整数的运算要远远快于对浮点数的运算,,所以,在人类的思维习惯与计算机特点之间
7、必须做一个折衷。,折衷的结果就是,虽然都是数值类型,但程序员在程序时,必须事先想好,,哪些数据是必须带小数计算的,那些数据定为实型,比如工资,没有哪个员工会认为老板可以将自已工资中的小数位忽略不计;而那些可以不用,或者可以不计较小数的数值,则被建议设计成整型,比如人的年纪,虽然可以,但我们很少需要有类似1.6岁这种说法。想想,假如一位女士说自已28岁,而你却立刻纠正她:“不,准确地说,您已经28.7岁了”结局会怎样呢?为了那0.7岁,不仅你的程序会跑得慢,而且会倍受女人的白眼杀伤。,想想其实也很自然:工资必须设计成实型,而年龄虽然不是必须,但建议设计成整型。,理解数值的范围1/3,顾及计算机
8、的运行,速度,,人(程序员)做出了妥协,必须面对“整型”或“实型”的考虑。,另一方面,和速度同样重要的是计算机的,空间,的考虑。它让程序员必须再做一步妥协。,小时候你一定有过这样的经历:你说100,另一个小伙伴就说101。你说1000,他就说1001,你说10000,他就说:那我10001。总之他就是要比你大1。,这种游戏不会有分出胜负的结局,只会让你郁闷为什么就不能有个最大数让你说了以后,那家伙就再了无法往上加1了!现在你学编程,儿时的“妄想”终于在计算机的世界中实现了。在计算机世界中,你可以说一个数,当别人再住这个数加1时,真不幸,计算机会告诉他说:加1是加1了,可是结果变成0,甚至是负数
9、理解数值的范围2/3,这就是计算机的,空间,问题:任何一个量,都有一个大的上限,和小的下限,出了这个范围(比上限还大,比下限还小),就会称为,溢出(,Overflow),。,这是一种物理的现实,也是一种人为的规定。,为什么要这样规定?,原因是计算机的存储器,特别是其中很重要的内存,其可存储的数据多少总是有限度。(而且,同样大小数,2进制的表达形式比10进制长得多),如果允许编程像生活中一样任何一个数都可以很大很大,也就是这个量表达起来将很长很长,那么存储器的空间就会很快用完!(无穷大就不用说了,因为不可能有无穷大的存储器)。,理解数值的范围3/3,数值类型在被划分为整型和实型后,将根据所占
10、用的空间而被继续划分为几种不同类型。,而我们,在考虑工资必须设计成带小数的实型后,必须再面对一个设计上的考虑,工资这个量在程序里要占多大空间?依据其实很简单,就看你的单位最高月薪是多少,凭此找到一个合适的类型。比如月薪不超过1万元,那我们选择一个刚刚可以包含10000的数据类型。,任何一种基本数据类型,都有其范围。比如字符类型,它的最大值是255,那么,当一个数在其类型的范围已经是最大值时,如果再往上加1,就会造成“溢出”。,举例,:2字节的整型,求其取值范围。,其实,有限定的范围的数量,并不只在计算机中出现。钟表就是一个例子。10点再加1点是11点,再加1点是12点,可是再加1点,就又回到1
11、点。再如汽车的行程表,假设最多只能显示99999公里,当达到最高值后继续行驶,行程表就会显示为00000公里。,理解有符号数与无符号数1/2,回头看上一节,我们所讲的数都是正数。同样是年纪和工资,前者不需要有负值,但后者可能需要至少所有的老板都这样认为。,就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。,在计算机中,可以区分正负的类型,称为,有符号类型,signed,,,无正负的类型(只有正值),称为,无符号类型,unsigned,。,数值类型分为整型或实型,其中整型又分为无符号类型或有符号类型,而实型则只有有符号类型。,字符类型也分为有符号和
12、无符号类型。,那么,,负数在计算机中如何表示呢?,答案是:负数用补码表示!,思考1:单字节数和双字节数的 1 在计算机里是怎么表示的?,思考2:无符号类型的单字节数255在计算机里是怎么表示的?,理解有符号数与无符号数2/2,可能有同学这时会混了:,为什么 1111 1111 有时表示255,有时又表示-1?,答案:你自已决定一个数是有符号还是无符号的。,写程序时,指定一个量是有符号的,那么当这个量的二进制各位上都是1时,它表示的数就是-1;,相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说,最大值就是255。,基本数据类型1/3,C,语言中的,数据类
13、型,主要包括以下几种:,基本类型:,整型,、,实型,(浮点型)、,字符型,、,空类型,构造类型:数组、结构、联合、指针类型,基本数据类型2/3,标识符,类型说明,长度(字节),范围,备注,char,字符型,1,-128 127,-2,7,(2,7,-1),unsigned char,无符号字符型,1,0 255,0(2,8,-1),int,整型,4,-2147483648 2147483647,-2,31,(2,31,-1),unsigned,int,无符号整型,4,0 4294967295,0 (2,32,-1),short,int,短整型,2,-32768 32767,-2,15,(2,1
14、5,-1),unsigned short,int,无符号短整型,2,0 65535,0 (2,16,-1),float,实型(单精度),4,-1.18*10,38,3.40*10,38,7位有效位,double,实型(双精度),8,-2.23*10,308,1.79*10,308,15位有效位,long double,实型(长双精度),16,-10,4931,10,4932,19位有效位,void,空类型,0,0,基本数据类型3/3,有,short,int,(,短整型),所以也就有对应,long,int,(,长整型)。,long,int,用于表示4个字节(32位)的整数。,在我们现在普通使用的
15、32位计算机中,,int,默认就是4个字节,所以,long,也是可以省略的(,long,int,和,int,完全一样)。,(较早几年,也就是,Windows 3.1/DOS,流行的时候,那时的机器及操作系统都是16位的,这种情况下,,int,默认是16位的。此时,如果想实现32位整数,就必须定义为这样的类型:,long,int,)。,在浮点数方面,我们最常用的将是,double。,它的精度适合于我们日常中的各种运算。当然,,float,的精度也在很多情况下也是符合要求的。,2.1.2,常量,C,语言中的数据,有,常量,和,变量,之分,它们分别属于上述这些数据类型。,常量,:程序运行过程中,其值
16、不能被改变的量。常量分为不同的类型:,整型常量、实型常量、字符常量,,这种从其字面形式即可判断的常量称为,字面(直接)常量,。,通常,常量还以一种符号形式存在(即用符号代表一个常量),称为,符号常量,。如:,#,define PI 3.1416,#define Salary_Wang 1200,含义清晰,能做到“一改全改”,问题,:使用符号常量的好处?,整型常量的表示方法,整型常量即整常数,在语言中可用三种形式表示:,十进制。例如10、36。,八进制(以数字开头)。例如012。,十六进制(以数字+字母,x(,大小写均可)。例如0,x36,。,有时,你也会看到一些老的代码中,在一些整型常后面加一
17、个大写或小写的,L,字母。如:989,L,这是什么意思呢?原来,一个常数如果其范围允许,那么计算机默认将其认为是,int,类型的,那么要让计算机把某个数认为是,long,int,类型,就可以在其后面加,L,或,l。,不过,这在以前的16位机器才有意义了。现在,我们的机器都是32位,,long,int,和,int,完全一样,都是占用4个字节,所以,我们没有必要这样用了。,实型常量的表示方法1/2,实型数在语言中称为浮点(,float,),数,它有两种表示形式:,使用十进制表示。例如:3.14、9.8。,指数形式:,E,(,e,),。例如3.0+5等。,在此需要注意的是“,规范化的指数形式,”的写
18、法。即:在字母,e,或,E,之前的小数部分中,小数点前应该有且仅有一个非零的数字。,实型常量的表示方法2/2,我们学过的实数数据类型有:,float,double,long double。,默认的常数类型是,double,。,比如你写:1.234;,那么,,C+,按,double,类型为这个数分配内存,也就是说为它分配8个字节。如果要改变这一点,可以通过加后缀字母来实现。,加,f,或,F,,指定为,float,类型。,加,l,或,L,指定为,double,类型。,以下示例:,12.3,f/float,类型,12.3/默认类型(,double),12.3L/long double,类型,1.23
19、e400/long double,类型,因为值已不在,double,类型的取值范围内,2.23*10,-308,1.79*10,308,字符型常量的表示方法,在语言中,字符型常量是用单引号括起来的一个字符。例如,,A,、,、,等。,此外,语言还允许使用一种特殊形式的字符常量,就是以反斜杠“”开头的,转义字符,(意思是将反斜杠后面的字符转化为别的意思,见教材,P28,表,2.2,)。,问题,:为什么要使用转义字符。,字符数据在内存中的存储,字符类型关键字为,char,,所有的,C,系统都规定以一个字节来存放一个字符。实际上,这一个字节的存储空间存放的是该字符相应的,ASCII,值。,所以,字符
20、型数据和整型数据是通用的。,C,语言的这种对字符型数据的处理方法增大了编程的自由度(,例子,:大小写字母转换)。,另外,字符型变量也有两种:,char、unsigned char,,,在使用时,要想输出,ASCII,表后128位的字符,就要使用,unsigned char,类型。,思考题,:,用字符形式输出一个大于256的数值,会得到什么结果?,字符串常量,字符串常量,是由一对双括号括起来的若干字符序列。字符串中字符的个数称为,字符串长度,。长度为0的字符串(即一个字符都没有的字符串)称为,空串,,表示为“”(一对紧连的双引号)。,问题:,求字符串,“,How do you do!,”,的长度
21、答案:,14(空格也是一个字符)。如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。,例如:,(1),C:msdosv6.22 C:msdosv6.22,(2)I say:Goodbye!I say:Goodbye!,字符串的存储,C,语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个0作为字符串的结束标志。,注意,:在源程序中书写字符串常量时,不必加结束字符0,否则画蛇添足。如果有一个字符串为“,CHINA”,,则它在内存中的实际存储如下所示:,C,H,I,N,A,0,最后一个字符0是系统自动加上的,它占用字节而非字节内存空间。,字符与字符串的比较,定界符不同,:字
22、符常量使用单引号,而字符串常量使用双引号;,长度不同,:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数;,存储要求不同,:字符常量存储的是字符的,ASCII,码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志0。,2.1.3,变量,变量,:在程序运行过程中,其值可以被改变的量。一个变量应该有一个名字,用以标识别自己;另外,它还要在内存中占据一定的存储单元,用以存放数据。,所以,变量具有两个要素:,变量名,(变量命名遵循标识符命名规则);,变量值,。,实际上,变量名是一个符号地址,在编译连接时由系统分配一个内存地址。在程序运行过程中,变量值存储在内存中,并通
23、过变量名来引用变量的值,变量的定义,在语言中,要求对所有用到的变量,必须“,先定义、后使用,”。,变量定义的一般格式:,存储类型 数据类型 变量名,变量名2;,例如:,float,radius,length,area,;,变量定义的好处:,保证变量在程序运行过程中得以正确使用。,便于系统在编译过程中分配不同的存储空间。,便于对变量使用合法性的检验。,变量的初始化,在语言中,我们对变量赋值可以使用赋值语句也可以在定义时直接,初始化,。我们称在定义变量的同时进行赋初值的操作为,变量初始化,。,变量初始化的一般格式:,存储类型 数据类型 变量名=初值,变量名2=初值2;,例如,,float,radi
24、us,=,2.5,length,area;,实际上,变量的初始化在程序进行解释时相当于一个赋值语句。如上式实际为:,float radius,length,area;,radius=2.5;,思考:,如果我们不赋初值,变量是否就没有值呢?,各种数据类型间的混合运算(1),在语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。,如果一个运算符两侧的操作数的数据类型不同,则系统按“,先转换、后运算,”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。,各种数据类型间的混合运算(2),横向,向左的箭头,表示必须的转换。,char,和,short,型必须转
25、换成,int,型,,float,型必须转换成,double,型。,纵向,向上的箭头,表示不同类型的转换方向。,注意,:,1、,箭头方向只表示数据类型由低向高转换,不要理解为,int,型先转换成,unsigned,型,再转换成,long,型,最后转换成,double,型。,2、,结果为其中的高级类型。,3、,上述转换为系统自动完成。,转换规则如图所示。,小容器无法装超出容量的东西。大容器可以装小于容量的东西。,double,long,unsigned,int,高,低,float,char,short,强制类型转换,除自动转换外,语言也允许,强制转换,。数据类型强制转换的一般格式为:,(要转换成的数据类型)(被转换的表达式),当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。,例如,:(,double)a,等价于(,double)(a),求值,:(,float)5/2、,(,float)(5/2),注意,:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如,(,double)a,只是将变量,a,的值转换成一个,double,型的中间量,其数据类型并未转换成,double,型。,课后习题,P552、3、4、12、15、21、23,上机安排,编写第一个,C,语言程序(,P24-11,),。,调试或改写例题1-1 和 1-2,实验一,






