1、准备上课,主讲:李越辉 北京工商大学计算机学院,C语言程序设计,第二讲 数据类型,通过介绍C/C+语言的数据类型和存储特点了解C/C+语言中数值数据和字符数据的表示方法、掌握C/C+语言基本数据类型的存储形式,变量的定义和赋值方法,了解运算过程中数据类型的转换方法。,内容 回顾,main( ) 是每一个C+程序都必须具有的函数,称为主函数;你可以把它看成是程序的入口; 在 main 前面可以用void 来表示这个主函数 main( ) 没有返回值,即它不代表计算出来的是什么值,它仅仅是规范了完成计算所作的一系列步骤; 这些步骤用花括号 括起。,内容 引申,C/C+语言程序是由函数构成的; 函数
2、有三类: 主函数 库函数 用户自定义函数 库函数中用的最普遍的是数学函数,常用的数学函数有几十种。,程序的输入与输出,C语言中使用printf输出; C语言中使用scanf输入; 在C+中还有cin和cout。,在C+ 中引入术语 stream(流),指的是来自设备或传给设备的一个数据流。cout表示输出流对象,它是输入输出流库的一部分。与cout 相关联的设备是显示器。在程序中有了关联字cout 就有了将数据流传到显示器的条件,这时用插入操作符“ ” 将其后的数据插入该流中去。比如下面的两条语句:cout“welcome to BTBU”;coutendl;,I/O流与插入、 抽取操作符,可
3、以用图来说明,放在引号“ ”中的字符串welcome to BTBU 是要给显示器显示的数据,用插入操作符将其传至显示设备上。 endl 在字符串之后插入回车,他们直接将字符串写到屏幕上。,显示器,输出,插入操作符可以把多个输出数据组合或级联成单个的输出语句。比如下面的语句:cout “Welcome to BTBU,” “ I am a student.” endl; 这时屏幕上显示Welcome to BTBU, I am a student.,插入操作符,cin 表示输入流对象,它也是输入输出流库的一部分,与 cin 相关联的输入设备是键盘,当我们从键盘输入字符串时,形成了输入流(数据流
4、),用抽取操作符 将数据流存储到一个事先定义好的变量中,比如下面两条语句: float x; cin x; 第一条是定义了一个浮点数类型的对象:变量x。第二条是用键盘敲入一个带小数点的数,比如:3. 14159。,输入,上图 描述了提取输入流的示意图 有关什么是变量,如何从键盘输入数据的内容放到下一章去讲。,抽取操作符,注释(comments)是非常重要的一种手段。没有注释的程序不能算作合格的程序。我们要建立起这样的观念:程序是给人编的,让人家看懂程序是第一位的事情。特别是将来你可能参加一个团队,几十人甚至几百人一起合作编程,相互协同,更需将注释写得清清楚楚、明明白白,因此,我们规定程序中须有
5、如下注释内容。,注释及其重要性,程序名称; 程序要实现的功能,比如要完成什么数学运算; 程序的思路和特点; 编程的人与合作者; 编程的时间,修改后的第几版本; 其它; 对初学者,希望每条语句都加上注释,要求注明这条语句是做什么用的。,注 释 的 内 容,带注释的程序,C语言的数据类型 数值数据的表示 文字数据的表示 变量的定义和赋值 C语言类型修饰符 表达式中数据类型转换,C语言程序的 数据类型,2.1 C语言的数据类型,所有的数据,在进行处理时都需要先存放进计算机的内存中,所以了解不同的数据在计算机中存储的形式是很重要的,2.2 数值数据的表示,C语言中数值数据有两种:整数和浮点小数。,整数
6、,表示形式 十进制整数:123,-567 八进制整数:011,072 十六进制整数:0x12,-0xf1 整数的存储空间为2个字节,即16个二进制位 取值范围为-215215-1,即-3276832767。 如果超过这个范围,使用占4个字节的长整型数,在整数后面加上一个字母L(大小写均可),此时取值范围可以扩大到-231231-1,即-21474836482147483647。,19,int 整型,占用2字节,数的表示范围是 -32768 32767 unsigned int 无符号整型,占用2字节,数的表示范围:0 65535 long int 长整型,占用4字节,在整数后面加上一个字母L(
7、大小写均可),数的表示范围: -2147483648 2147483647 unsigned long int 无符号长整型,占用4字节,数的表示范围:0 4294967295,整型即整数类型,它又可分为4种,20,符号位,占用2字节,数的表示范围是-32768 32767,16位有符号整数的表示,21,16位无符号整数的表示,浮点小数,C语言中的浮点小数描述的是实数 采用十进制小数形式或者指数形式表示。 十进制小数形式:包含整数部分、小数点和小数部分。例如1.45、-34.0、.56、0.0,注意:小数点不能省略。 指数形式:包含尾数部分、字母E或e和指数部分。例如 2.78E12、1.34
8、e-4分别表示2.78*1012、1.34*10-4。 注意:尾数部分不能省、指数部分必须是整数 浮点小数一般为单精度浮点类型,占用4个字节,有效位数67位,如果需要精度特别高,可以采用双精度浮点类型,有效位数可以达到1617位。,23,float 浮点型,占用4字节,有效位为7位,数的表示范围:double 双精度型,占用8字节,有效位为15位,数的表示范围:long double 长双精度型,占用10字节,有效位为19位,数的表示范围:,实型即实数类型,它又可分为3种,2.3 文字数据的表示,文字数据分为两种类型:单个字符和字符串。,单个字符,单个字符的表现形式是由单引号括起来的一个字符
9、a A + 5 ? + 其中单引号、双引号和反斜杠的表现形式比较特殊,分别是、”、 在C语言中转义字符被认为是具有特殊意义的单个字符,例如n,代表一个换行符。 单个字符在内存中只占用1个字节,其存储的内容为该字符在ASCII码表(见附录)中对应的数值。,字符串,字符串是由双引号括起来的字符序列 ”this is a program.” 、”Hello!” 、 ”I like C” 字符串中的字符按照从左到右的顺序,依次存储在一段连续的空间里,其每一个字符占用一个字节,内容为该字符在ASCII码表中对应的数值。 注意:C语言的字符串在实际存储时,将自动在字符串尾部加了一个结束标志0(其ASCII
10、码值为0)。 试分析:a与”a”相同吗?为什么?,2.4 变量的定义和赋值,C语言中的数据有两种基本形式:常量和变量。 常量的值是固定的,是具体的值; 变量是相对常量而言的,在程序中经过操作其值允许改变的量称之为变量; 变量在使用前必须加以定义(在声明中定义)。,变量的定义,类型标识符 变量名; 变量名要符合C语言规定的标识符的命名规则,即只能由字母、数字和下划线组成,首字符必须为字母或下划线。此外C语言中规定的有特殊用途的关键字例如int、float、if等,不能作为变量名称。 变量名的例子如:a b2 stu1 x1_1 sum _name1 是正确,2ac stu-1 len#1 els
11、e int float是错误的 注意:C语言中大小写是敏感的,即int 和Int是不同的,但是习惯上,C语言中的变量名一般用小写字母表示。,29,变量和变量名,建议:你在给变量命名时考虑实际含义,以便提高程序的易读性。比如苹果单价用ApplePrice表示。,30,变量的数据类型,依数据类型不同变量可分为两大类; 第一类是基本数据类型,包括整型、浮点型和字符型; 第二类是构造数据类型,包括数组、结构、联合、枚举等。所谓构造数据类型,是指这种类型,是由若干个基本数据类型的变量按特定的规律组合构造而成的。 计算机中的各种数据是存储在内存空间中的。不同类型的数据占用大小不同的内存空间。,2.4 变量
12、的定义和赋值,变量的定义类型 变量的数据类型决定了它的存储类型,即该变量占用的存储空间。所以定义变量类型,就是为了给该变量分配存储空间,以便存放数据。,2.4 变量的定义和赋值,变量的赋值 在定义一个变量时,系统会自动根据变量类型分配存储空间。但是当变量的值即存储在该空间的值并未给出时,其值可能是随机放入其中的垃圾值,所以变量需要预置一个值,即赋值。 赋值操作通过赋值符号“=”把右边的值赋给左边的变量:变量名=表达式; 例如 x=3; a=a+1; f=3*4+2; 注意事项: 数学中的“=”符号不同于C语言中的赋值符号“=”,在C语言中a=a+1是成立的,它表示“变量a加上1的值赋给变量a”
13、。在C语言中判断两个数是否相等时使用符号“= =”,33,变量a变量值内存单元地址XXXX,30,变量的定义和内存地址的关系,变量、变量的值和地址,34,变量必须先定义再使用(思考为什么?); 在变量定义时就要赋初值,这叫变量的初始化; 对变量的赋值过程是“覆盖”过程,所谓“覆盖”是在变量地址单元中用新值去替换旧值; 读出变量的值,该变量保持不变,相当于拷贝一份出来; 参与表达式运算的所有变量都会保持原来的值不变(思考为什么)。,变量赋值的特点,35,int a=0, b=0, c=0; / 声明a,b,c为整型变量 / 均初始化为0 a=7; / a赋值为7,覆盖了原来的0 b=a; / b
14、赋值为a,a中的值覆盖了b中的值 / 但a中的值不变 c=a+b; / 将a+b的值赋给c,a+b的值为14 / 去覆盖c中的0,a与b保持7不变 a=a+1; / 将a+1的值赋给a,a+1的值为8 / 覆盖了原来的7,说明:a=a+1;可简化写作a+; 下面来说明这五条语句的执行过程。,举例说明上述特点,36,定义并初始化,执行 b=a,0,执行 c=a+b,0,执行 a=7,执行 a=a+1,8,0,7,14,7,a的地址单元 b的地址单元 c的地址单元,变量赋值过程,2.4 变量的定义和赋值,变量的赋值 如果赋值时两侧类型不一致时,系统将会作如下处理: 将实数赋给一个整型变量时,如将3
15、.9赋给int型变量a,即a=3.9,系统自动舍弃小数部分,此时a=3。 将整数赋给一个浮点型变量时,如将12赋给float型变量f,即f=12,系统将保持数值不变并且以浮点小数形式存储到变量中,此时f=12.000000。 当字符型数据赋给一个整型变量时,如将A 赋给int型变量x,即x=A,不同的系统实现的情况不同,一般当该字符的ASCII值小于127时,系统将整型变量的高字节置0、低字节存放该字符的ASCII值,所以此时x=65 。 程序L2_1.C:赋值时类型自动的转换示例。,2.4 变量的定义和赋值,变量的赋值 字符型变量的值可以是字符型数据、介于-128127的整数或者转义字符。
16、计算机存储的是二进制数,所以将一个字符数据存放到一个字符变量中,实际上存储的是该字符对应的ASCII码的二进制形式。 如大写字符A的ASCII码代码用二进制表示是01000001(十进制的表示为65,八进制为101,十六进制为41),而字符型常量A、十进制整数65、转义字符101或x41的二进制码相同,均为01000001,因此这四种形式的数据赋给一个字符型变量的结果相同,如程序所示。 思考: L2_2.C 中c1、c2、c3、c4分别加上32输出的结果是什么?为什么? 加上256的结果是什么?,2.5 C语言类型修饰符,C语言共有4种类型修饰符: long 长型 short 短型 signe
17、d 有符号型 unsigned 无符号型 long int(简写为long)型的存储长度为4个字节,范围-231231-1,用于存储整数超过int型取值范围的情况。 long double 型存储长度16个字节,约24位有效数字,取值范围超过double型。 有符号型signed和无符号型unsigned适用于char型、int型和long型三种类型,区别在于它们的最高位是否作为符号位。unsigned char型取值范围0255(即028-1),unsigned int(简写为unsigned)型取值范围065535(即0216-1),unsigned long型取值范围0232-1。 思考
18、:如何得到表达式1*2*3*4*5*6*7*8*9的正确结果?,2.6 表达式中数据类型转换,自动类型转换 C语言规定,不同类型的数据在参加运算前会自动转换成相同类型,再进行运算。转换的规则是: 如果表达式中有float型或double型,自动转换成double型再运算,结果为double型。如果表达式中无float型或double型,但是有long型,数据自动转换成long 型再运算,结果为long型。其余情况为int型。 程序L2_4.C,2.6 表达式中数据类型转换,强制类型转换 在C语言中也可以使用强制类型转换符,强迫表达式的值转换为某一特定类型。强制类型转换形式为 (类型)表达式 强
19、制类型转换最主要的的用途 满足一些运算对类型的特殊要求,例如求余运算符“%”,要求运算符两侧的数据为整型,(int)2.5%3 防止丢失整数除法中的小数部分,例如 int x=3,y=2; float f; f=(float)x/y; 此时f 的值为1.500000。如果不用强制类型转换,即f=x/y ,结果为1.000000。,作业与上机练习,2.1 请将c语言的数据类型和其他高级语言的数据类型做比较。c有哪些特点? 2.2 C语言为什么要规定对所有用到的变量要“先定义,后使用”。这样做有什么好处? 2.3 字符常量与字符串常量有什么区别? 2.4 求下面算术表达式的值。(1) x+a%3*(int)(x+y)%2/4 设x=25,a=7,y=47(2) (float)(a+b)/2+(int)x%(int)y 设a=2,b=3,x=35,y=25 2.5 写出下面表达式运算后a的值,设原来a=12。设a和n已定义为整型变量。 (1) a+=a (4) a/=a+a (2) a-=2 (5) a%=(n%=2),n的值等于5 (3) a*=2+3 (6) a+=a-=a*=a C程序设计题解与上机指导中实验二,再 见,