1、第二章: C 数据类型,数据:,数据是对事实、概念或指令的一种特殊表达形式,这种特殊的表达形式可以用人工的方式或者用自动化的装置进行通信、翻译转换或者进行加工处理。 采用二进制编码表示的数字、文字、图画、声音和活动图象才能由计算机进行处理。 是程序加工处理的对象,数据区分为,数值型数据 非数值型数据文字图形声音活动影像,数据的表示,计算机内所有信息都是用二进制数表示的,原因如下: 容易实现 工作可靠 逻辑判断方便 运算规则简单 思考: 数值怎样以二进制数的形式存储在计算机内? 计算机内的二进制代码怎样表示不同的意义?,提示:,计算机只能识别二进制机器码,那么计算机怎样处理人们日常的事物呢?-通
2、过编码形成数据 日常人们运算使用十进制,计算机怎样识别与表示呢?-通过数制转换形成数据 还有 符号位/定/浮点表示及相关运算,都通过特定的数据来表示、存储、运算。 计算机用特定类型的数据表示特定信息, C语言对程序中要用到的每一个变量 都要事先指定它的数据类型!,为什么要指定数据类型?,1不同类型的数据在内存中占据不同长度的存储区。 2不同类型的数据取值范围不同。 3不同类型的数据有不同的操作。,C 数据类型,1基本类型,2构造类型,3指针类型,整型,字符型,浮点型,单精度,双精度,数组,结构体,共用体,枚举,短整型,长整型,C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。本章将介
3、绍基本类型中的整型、实型和字符型三种数据。,常量,1.常量的概念 在程序运行过程中,其值不能被改变的量称为常量。 2.常量的分类 (1)整型常量(如12、0、-3为整型常量) (2)实型常量(4.6、-1.23为实型常量) (3)字符常量( a、d字符常量) (4)符号常量:有时为了使程序更加清晰和便于修改,用一个标识符来代表常量,即给某个常量取个有意义的名字,这种常量称为符号常量。 例:#define PI 3.14使用符号常量的好处:( a)含义清楚、见名知意。( b)修改方便、一改全改。,例:,#define PI 3.14 main() float area;area=10*10*PI
4、;printf(“area=%fn“,area); 结果:area=314.000000,变量,1.变量的概念 在程序运行过程中,其值可以被改变的量称为变量。 2.变量的两个要素 (1)变量名。每个变量都必须有一个名字变量名,变量命名遵循标识符命名规则。 (2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。,变量在内存中的存储,变量定义方式:,存储类型 类型名 变量名,变量定义:,在C语言中, 变量必须先定义,后使用,若没有定义变量直接在程序中使用变量:student_num=30; 则编译时会指出未定义错误。,若程序中有: int student_num;
5、 /*变量定义*/:student_num=30; /*给变量赋值*/则student_num变量是合法的。,标识符 命名规则,(1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。 (2)有效长度:随系统而异,但至少前个字符有效。如果超长,则超长部分被舍弃。例如,由于student_name和student_number的前个字符相同,有的系统认为这两个变量,是一回事而不加区别。在TC V2.0中,变量名(标识符)的有效长度为个字符,缺省值为。 (3)C语言的关键字不能用作变量名。 (4)C语言对英文字母的大小写敏感,即同一字母的大小写,被认为是两个不同的字符。习惯上,变量名和
6、函数名中的英文字母用小写,以增加可读性。思考题:在C语言中,变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗?,变量 命名规则,遵循的原则: 1.标识符应当直观且可以拼读,可望文知意 2.标识符的长度应当符合“min-length & max-information”原则 3.程序中不要出现仅靠大小写区分的相似的标识符 4.变量的名字应当使用“名词”或者“形容词名词”。 5.全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身 6. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等 7.尽量避免
7、名字中出现数字编号,如Value1,Value2 等,匈牙利 命名法,主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解” 例如所有的字符变量均以ch 为前缀,若是指针变量则追加前缀p。如果一个变量由ppch 开头,则表明它是指向字符指针的指针。 “匈牙利”法最大的缺点是烦琐,例如 int i, j, k; float x, y, z; 倘若采用“匈牙利”命名规则,则应当写成 int iI, iJ, ik; / 前缀 i 表示int 类型 float fX, fY, fZ; / 前缀 f 表示float 类型,整型数据,1.分类 根据占用内存字节数的不同,整型变量又分为类: (1)基本
8、整型(类型关键字为int)。 (2)短整型(类型关键字为short int)。 (3)长整型(类型关键字为long int)。 (4)无符号整型。无符号型又分为无符号基本整型(unsigned int)、无符号短整型(unsigned short)和无符号长整型(unsigned long)三种,只能用来存储无符号整数,变量类型 类型名 占用的内存空间(字节) 范围短整型 int或short int 2 -3276832767 长整型 long或 long int 4 -21474836482147483647 无符号短整型 unsigned或 unsigned int 2 065536 无符
9、号长整型 unsigned long 4 04294967295,掌握重点:占用内存字节数与值域,占用内存字节数为n的(有符号)整型变量,其值域为:-2n*8-1(2n*8-1-1);无符号整型变量的值域为:0(2n*8-1)。,Unsigned int:,int:,例:变量定义,int a, b, c; 或:int a; int b,c;,short int a, b, c; 或:short a, b, c;,long int x, y, z; 或 long x, y, z;,unsigned m, n, t; 或 unsigned short m, n, t; unsigned long
10、d, k, l;,整型常量 .三种表示形式 整型常量即整常数,在语言中可用三种形式表示: (1)十进制(数码取值:09)。例如10、36。 (2)八进制(以数字开头,数码取值:07)。例如012。 (3)十六进制(以数字+小/大写字母x开头,数码取值:AF或af)。例如0x36,0X5A。课堂练习:判断以下常量是否合法?9A、0X6G、029,等等2.类型匹配规则为:一个整型常量,可以赋给能容纳下其值的整型变量。 例如,其值在-(-)的整型常量,可以赋给int型变量和long int型变量;其值在-(-)的整型常量,就只能赋给long int型变量。,实型数据,实型常量的表示方法 实型(浮点型
11、)有两种表示形式:1、 十进制小数形式。由数字09和小数点组成(必须有小数点)。 例如:.123、123.、123.0、0.02、 指数形式。格式:aEn。(a:十进制数 n:阶码(只能为整数,可以带符号) 例如:123e3、123E3都是实数的合法表示。,实型变量的分类,实型变量分为:单精度(float)、双精度(double) 。 单精度:其类型说明符为float 单精度说明符 双精度:double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-383.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7
12、E-3081.7E+308,可提供16位有效数字。,实型变量说明的格式和书写规则与整型相同。 类型说明符 变量名标识符,变量名标识符,. 例如: float x,y; (x,y为单精度实型量) double a,b,c; (a,b,c为双精度实型量) 说明:1、实型常数不分单、双精度,都按双精度double型处理。 2、实型常量可以赋值给一个float、double、long double型变量。根据变量的类型截取实型常量中相应的有效数字。,字符型数据,1.字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。例如,A、等。字符常量的特点: 1.字符常量只能用单引号括起来,不能用双引号或
13、其它括号。 2.字符常量只能是单个字符,不能是字符串。 3.字符可以是字符集中任意字符。但数字被定义为字符型之后就 不能参与数值运算。如5和5 是不同的。5是字符常量,不能参与运算。 2.转义字符 语言还允许使用一种特殊形式的字符常量,就是以反斜杠“ ”开头的转义字符。 注意:如果反斜杠或单引号本身作为字符常量,必须使用转义字符:。,字符变量,字符变量的类型关键字为char,一般占用1字节内存单元。 1.变量值的存储 字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。 例如, char ch1, ch2; /*定义两个
14、字符变量:ch1,ch2*/ ch1=a; ch2=b; /*给字符变量赋值*/,特性,字符数据在内存中存储的是字符的ASCII码 一个无符号整数,其形式与整数的存储形式一样,所以语言允许字符型数据与整型数据之间通用。 (1)一个字符型数据,既可以字符形式输出,也可以整数形式输出。 案例 字符变量的字符形式输出和整数形式输出。 main() char ch1,ch2; ch1=a; ch2=b; printf(“ch1=%c,ch2=%cn”,ch1,ch2); printf(“ch1=%d,ch2=%dn”,ch1,ch2); 程序运行结果: ch1=a,ch2=b ch1=97,ch2=9
15、8,特性,2)允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算。案例 字符数据的算术运算。 main() char ch1,ch2; ch1=a; ch2=B; /*字母的大小写转换*/ printf(“ch1=%c,ch2=%cn”,ch1-32,ch2+32); printf(“ch1=%d,ch2=%dn”,ch1-32,ch2+32);,字符串常量,字符串常量的概念和字符串长度 字符串常量是用一对双引号括起来的若干字符序列。 字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为“ ” (一对紧连的双引号)。 例如,“How
16、 do you do.”、“Good morning.”等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。 如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。 例如:(1)C:msdosv6.22 “C:msdosv6.22“ (2)I say:“Goodbye!“ “I say:“Goodbye!“ “,字符串的存储,C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个0作为字符串的结束标志。 注意:在源程序中书写字符串常量时,不必加结束字符0,否则画蛇添足。 如果有一个字符串为“CHINA”,则它在内存中的实际存储如下所示:最后一个字符0是系统自动加上的
17、,它占用字节而非字节内存空间。,综上所述,字符常量A与字符串常量“A“是两回事: (1)定界符不同:字符常量使用单引号,而字符串常量使用双引号; (2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 (3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。 (4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节存放字符0(ASCII值为0),这是字符串的结束标志。,数据类型转换,(1) 在语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。 如果一个运算符两侧的操作数的数据类型不同,则
18、系统按“先转换、后运算”的原则,转换的方法有两种:自动转换(隐式转换);强制转换。 1、自动动转换(隐式转换) 自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。转换规则:(参看下页图示) (1) 类型不同,先转换为同一类型,然后进行运算。,数据类型转换,(2)图中纵向的箭头表示当运算对象为不同类型时转换的方向。可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。即按数据长度增加的方向进行,保证精度不降低。 (3)图中横向向左的箭头表示必定的转换(不必考虑其它运算对象)。如字符数据参与运算必定转化为整数,float型数据在运算时一律先转换为双精度型,以提
19、高运算精度(即使是两个float型数据相加,也先都转换为double型,然后再相加)。 (4)赋值运算,如果赋值号“=”两边的数据类型不同,赋值号右边的类型转换为左边的类型。这种转换是截断型的转换,不会四舍五入。,强制转换,强制转换是通过类型转换运算来实现。一般形式:(类型说明符)表达式功能:把表达式的结果强制转换为类型说明符所表示的类型。例如:(int)a 将a的结果强制转换为整型量。(int)(x+y) 将x+y的结果强制转换为整型量。 (float)a+b 将a的内容强制转换为浮点数,再与b相加 说明:(1)类型说明和表达式都需要加括号(单个变量可以不加括号) (2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。,例,main() float f=5.75;printf(“(int)f=%dn“,(int)f); /* 将f的结果强制转换为整型,输出 */printf(“f=%fn“,f); /* 输出f的值 */ 结果: (int)f=5 f=5.750000,