500 likes | 613 Views
第 2 章 C 语言数据类型. 第 2 章 C 语言数据类型. 数据 是程序处理的对象,程序的主要任务就是对数据进行加工、处理,而计算机中的数据包括数值型数据和非数值型数据。 比如,数学中的整数、实数就是数值型的数据,计算机能够处理的文字、声音、图像等就是非数值型的数据。数据类型是按照被说明量的性质、表示形式和占据存储空间的多少以及构造特点来划分的。 本章主要介绍 C 语言程序中的基本数据类型。. 2.1 数据类型间简介. 2.1 数据类型简介. C 语言为我们提供了丰富的数据类型. 2.2 常量. 2.2 常量.
E N D
第2章 C语言数据类型 • 数据是程序处理的对象,程序的主要任务就是对数据进行加工、处理,而计算机中的数据包括数值型数据和非数值型数据。 • 比如,数学中的整数、实数就是数值型的数据,计算机能够处理的文字、声音、图像等就是非数值型的数据。数据类型是按照被说明量的性质、表示形式和占据存储空间的多少以及构造特点来划分的。 • 本章主要介绍C语言程序中的基本数据类型。
2.1 数据类型简介 • C语言为我们提供了丰富的数据类型
2.2 常量 • 常量是指在程序运行的整个过程中,其值始终不变的量。 • 常量可以有不同的类型,可分为直接常量和符号常量。直接常量也就是日常所说的常数。符号常量则是指用标识符定义的常量,从字面上不能直接看出其类型和值。
2.2 常量 • 常量
2.2.1 整型常量 • C语言中整型常量有十进制、八进制、十六进制3种形式。 • 十进制整型常量的表示与数学上的整数表示相同,十进制整型常量没有前缀,由0~9的数字组成。 • 以下各数是合法的十进制整型常量: • 237,-568,65535,1627 • 以下各数不是合法的十进制整型常量: • 023 (不能有前导0),23D (含有非十进制数码)
2.2.1 整型常量 • 八进制整型常量的表示以数字0开头,即以0作为八进制数的前缀,由0~7的数字组成,八进制数通常是无符号数。 • 以下各数是合法的八进制常数: • 015(十进制为13) • 0101(十进制为65) • 0177777(十进制为65535) • 以下各数不是合法的八进制常数: • 256(无前缀0),03A2(包含了非八进制数字A) • -0128(出现了非八进制数字8和负号)
2.2.1 整型常量 • 十六进制整型常量的表示以0x或0X开头,即以0x或0X作为前缀(注:十六进制数前缀字符0x,x前面是数字0而不是字符o),由0~9,A~F或a~f的数字组成。 • 以下各数是合法的十六进制整型常量: • 0X2A(十进制为42) • 0XA0 (十进制为160) • 0XFFFF (十进制为65535) • 以下各数不是合法的十六进制整型常量: • 5A(无前缀0X) • 0X3H (含有非十六进制数码H)
2.2.2 实型常量 • 在C语言中,实型常量只能用十进制形式表示,不能用八进制和十六进制形式表示。 • 它有两种形式: • 小数形式和指数形式。
2.2.2 实型常量 • 1.小数形式 • 由正负号、0~7的数字和最多一个小数点组成(必须有小数点)。 • 如: • -1.85,0.3456, 120.0,.426,-11 • 都是十进制小数形式实数。小数点前面和后面可以没有数字。
2.2.2 实型常量 • 2. 指数形式 • 由十进制数加上阶码标志“e”或“E”以及阶码组成。其一般形式为:a E n。其中a为十进制数,n为十进制整数(n为正数时“+”可以省略)其值为:a×10n。 • 例如,1.234e+12 表示 1.234*10¹² • 0.25e-8 表示 0.25*10-8。 • 以下是合法的实数: • 1.234e+12(等于1.234×1012), 3.7E-2(等于3.7×10-2) • 2.34e+8(等于2.34×108) • 以下是非法的实数: • 568(无小数点), e-5(阶码标志“e”之前无数字), • -5(无阶码标志), 58.+e5(负号位置不对) • 2.7E(无阶码), 6.4e+5.8(阶码为小数)
2.2.3 字符常量 • 字符常量是用单引号括起来的一个字符。例如:‘a’、‘0’、‘A’、‘-’、‘*’都是合法字符常量,注意,‘a’和‘A’是不同的字符常量。 • 除了以上形式的字符常量以外,C语言还定义了一些特殊的字符常量,是以“\”开头的字符序列,称为转义字符。转义字符是一种特殊的字符常量,具有特定的含义,不同于字符原有的意义,故称“转义”字符。如‘\n’中的n不表示字母n而作为“换行”符。
2.2.3 字符常量 • 转义字符及其含义
2.2.3 字符常量 • 注意: • (1)字符常量只能用单引号括起来,不能用双引 • 号或其他括号。 • (2)字符常量只能是单个字符,不能是字符串。 • (3)字符可以是字符集中任意字符,但数字被定 • 义为字符型之后就以ASCII码值参与数值运 • 算。 • 如,‘6’和6是不同的,‘6’是字符常量,而6是 • 整型常量。
2.2.4 字符串常量 • 在C语言中,字符串常量是用双引号括起来的字符序列。例如,以下是合法的字符串常量: • “CHINA” • “This is a C program.” • “402754” • “+++\\? ab” • “*****” • “”表示一个空格 • “” 表示什么字符也没有 • “\n”表示一个转义字符换行 • ‘ab’既不是字符常量,也不是字符串常量。
2.2.4 字符串常量 • 字符串常量在内存中存储时,系统自动在每一个字符串常量的尾部加一个“字符串结束标志”,即字符‘\0’( ASCII码值为0)。 • 因此,长度为n个字符的字符串常量在内存中要占用n+1个字节的空间。 • 例如,字符串“C program”的长度为9(即字符的个数),但在内存中所占的字节数为10,即存放“C program\0”。
2.2.4 字符串常量 • 字符串常量在内存中存储时,系统自动在每一个字符串常量的尾部加一个“字符串结束标志”,即字符‘\0’(ASCII码值为0)。因此,长度为n个字符的字符串常量在内存中要占用n+1个字节的空间。例如,字符串“C program”的长度为9(即字符的个数),但在内存中所占的字节数为10,即存放“C program\0”。
2.2.4 字符串常量 • 再如,字符常量‘A’与字符串常量“A”在内存中存储的方式如下:
2.2.4 字符串常量 • 例2.1 分析下面程序的运行结果。 • void main() • { char string[]=“China\n\101\t\\”; • printf(“%s\n”,string); • } • 程序运行结果: • China • A \
2.2.4 字符串常量 • 字符常量与字符串常量的区别: • ⑴ 定界符不同。 • 字符常量使用单引号,而字符串常量使用双引号。 • ⑵ 长度不同。 • 字符常量的长度固定为1,而字符串常量的长度可以是0,也可以是某个整数。
2.2.4 字符串常量 • 字符常量与字符串常量的区别: • ⑶ 存储要求不同。 • 字符常量存储的是字符的ASCII码值,而字符串常量除了要存储字符串常量的有效字符外,还要存储一个字符串结束标志‘\0’。 • 说明: • 在C语言中,没有专门的字符串变量,字符串常量如果需要存放在变量中要用字符数组来处理。
2.2.5 符号常量 • 在程序中,可以定义一个符号来代表一个常量,这种相应的符号称为符号常量。例如:用PI代表圆周率π,即3.14159。 • 符号常量可以增加程序的易读性。 • 例如:用PI代表圆周率π,NAME代表姓名等。 • 符号常量提高了程序的通用性和可维护性,使用符号常量可以使修改该常量变得十分方便。
2.2.5 符号常量 • C语言中,用编译预处理命令#define来定义符号常量。例如: • #define PI 3.14159 • #define NUM 35 • #define NAME “liming” • #define END ‘$’ • *它不是C语句,故末尾不要加分号。 • *习惯上,符号常量用大写,变量用小写以示区别。另外,符号常量一旦定义,就不能在程序的其它地方给该标识符再赋值。
2.3.1 变量的概念 • 变量是指在程序运行过程中,其值可以改变的量。 • 例如,计算圆的周长的C语句: • i=2*3.14159*r; • i和r都是变量,其中,r可以有不同的值,i的值因r的值不同而不同。
2.3.1 变量的概念 • 变量的特征: • (1)它有一个变量名,变量名的命名方式符合标识符的 • 命名规则。例如,可以用name,sum作为变量名。 • (2)变量有类型之分。 • 不同类型的变量占用的内存单元(字节)数不同, • 因此每个变量都有一个确定的类型。例如,整型变 • 量、实型变量、字符型变量等。 • (3)变量可以存放值。 • 程序运行过程中用到的变量必须有确切的值,变量 • 在使用前必须赋值,变量的值存储在内存中。在程 • 序中通过变量名来引用变量的值。
2.3.1 变量的概念 • 程序运行过程中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中取数据。
2.3.1 变量的概念 • 例2.2 任意输入两个整数,输出它们的和、差、积 • #include <stdio.h> • void main( ) • { int a,b; /* 定义a,b为整型变量 */ • printf(“input a,b=”); /* 输出提示字符串input a,b= */ • scanf(“%d,%d”,&a,&b); /* 由键盘输入a和b的值 */ • printf(“%d+%d=%d\n”,a,b,a+b); /*计算a和b之和,并输出结果*/ • printf(“%d-%d=%d\n”,a,b,a-b); /*计算a和b之差,并输出结果*/ • printf(“%d*%d=%d\n”,a,b,a*b); /*计算a和b之积,并输出结果*/ • } • 程序运行结果: • 5,8↙ • 5+8=13 • 5-8=-3 • 5*8=40
2.3.2 变量的定义与初始化 • 1. 变量的定义 • 在C语言程序中,常量是可以不经定义而直接引用的,而程序中用到的所有变量必须先定义后使用。 • 变量定义的一般格式为: • 数据类型标识符 变量名1[,变量名2,变量名3,…,变量名n]; • 其中,[]表示可选项。 • 例如: • int a; /* 定义a为整型变量 */ • int m,n; /* 定义m和n为整型变量 */ • float x,y,z; /* 定义x,y,z为单精度实型变量 */ • char ch; /* 定义ch为字符型变量 */ • long int t; /* 定义t为长整型变量 */ • static double r; /* 定义r为长静态的双精度实型变量 */
2.3.2 变量的定义与初始化 • 进行变量定义时,应注意以下几点: • (1)允许在一个数据类型标识符后,说明多个相同类型的变量,各变量名之间用逗号隔开。 • (2)数据类型标识符与变量名之间至少用一个空格隔开。 • (3)最后一个变量名之后必须以分号“;”结尾。 • (4)变量说明必须放在变量使用之前,一般放在函数体的开头部分。 • (5)在同一个程序中变量不允许重复定义。例如,以下是不合法的定义。 • int x,y,z; • int a,b,x; /* 变量x被重复定义 *
2.3.2 变量的定义与初始化 • 2. 变量的初始化 • 在定义变量的同时可以给变量赋初值,称为变量初始化。 • 变量初始化的一般格式为: • 数据类型标识符 变量名1=常量1[,变量名2=常量2,…,变量名n=常量n] • 例如: • int m=3,n=5; /* 定义m和n为整型变量,同时m,n分别赋初值3,5 */ • float x=0,y=0,z=0; /* 定义x,y,z为单精度实型变量, • 同时x,y,z都赋初值为0 */ • char ch=‘a’; /* 定义ch为字符型变量,同时赋初值字符‘a’ */ • long int a=1000,b; /* 定义a,b为长整型变量, 同时a赋初值1000 */
2.3.3 整型变量 • 整型变量的基本类型符为int。可以根据数值的范围将整型变量定义为基本整型变量、短整型变量或长整型变量。 • 基本整型变量,用int 表示。 • 短整型变量,用short int 表示或用short表示。 • 长整型变量,用long int 表示或用long表示。
2.3.3 整型变量 • 计算机中数据是以二进制形式表示的,基本整型变量占用内存2个字节,即16位。16位中最左边的一位表示符号,该位为0,表示正数;该位为1,表示负数。 • 一个基本整型变量的取值范围为-215 ~(215-1),即 -32768~32767。 • 带符号基本整型变量 [signed] int • 无符号基本整型变量 unsigned int • 带符号短整型变量 [signed] short [int] • 无符号短整型变量 unsigned short [int] • 带符号长整型变量 [signed] long [int] • 无符号长整型变量 unsigned long [int]
2.3.3 整型变量 有符号数 无符号数
2.3.4 实型变量 • 实型数据与整型数据在内存中的存储方式不同,实型数据是按照指数形式存放的。系统把一个实数分成小数部分和指数部分分别存放。指数部分采用规范化的指数形式。
2.3.4 实型变量 • 实型变量分为以下3种: • 单精度(float) • 双精度(double) • 长双精度(long double)
2.3.4 实型变量 • 实型变量是用有限的存储单元进行存储的,因此提供的有效数字总是有限的,在有效位以外的数字将变得没有意义,由此可能会产生一些误差。 • 单精度实数只能保证7位有效数字,双精度实数只能保证15位有效数字,后面的数字无意义。 • 例如: • float a=12345.678; • float b=12345.6789; • 变量a和b的有效数值都是12 345.67,在内存中存储时,a为12 345.677 734,b为12 345.678 711,在忽略无效位后,两者相等。
2.3.4 实型变量 • 由于实数存在舍入误差,在使用时应注意: • (1)不要试图用一个实数精确表示一个大整数。 • (2)由于实数在计算和存储时会有一些微小的误差,因此实 • 数一般不能直接进行判断“相等”,而是判断接近或近似 • (3)避免直接将一个很大的实数与一个很小的实数相加、相 • 减,否则会“丢失”小的数。 • 例如: 某计算机允许表示具有七位有效数字的十进制数,计算333.3333+0.0002222222,若计算时没有位数的限制,则结果应当是3.3335222222。 计算机由于字长位数的限制,只能表示七位有效数字,于是只得将小数点后的七个数字全部删掉,而仅保留其整数部分,得到和值333.3335。 • (4)根据实际要求选择单精度或双精度。
2.3.5 字符型变量 • 字符型变量用来存放字符常量,注意只能存放一个字符。 • 例如: • char c1,c2,c3,c4,c5; • c1=’a’; 正确 • c2=“a”; 不正确 • c3=’abc’; 不正确 • c4=’\107’; 正确 • c5=’6’;正确
2.3.5 字符型变量 • 1.字符型数据在内存中的存放形式 • 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例如:char c1,c2; c1=’a’; c2=’b’; • 字符’a’的ASCII代码为十进制数97,字符’b’的ASCII代码为十进制数98,在内存中变量c1、c2的值如图所示。 实际上是以二进制形式存放的
2.3.5 字符型变量 • 2.字符型数据的使用 • 字符型数据在内存中是以ASCII码存储,因此,字符型和整型可以通用,字符型数据可以以字符形式输出,也可以以整数形式输出。 • 以字符形式输出时,先将内存中ASCII码转换成对应的字符,再输出。以整数形式输出时,则直接将ASCII码作为整数输出。字符数据还可参加算术运算,此时相当于对它们的ASCII码值进行算术运算,先将其1个字节转换为2个字节,然后进行运算。
2.3.5 字符型变量 • 例2.3 向字符变量赋予整数。#include <stdio.h>void main(){ char c1,c2; /* 定义c1,c2为字符型变量 */ c1=65; /* 将整数65赋给c1 */ c2=67; /* 将整数67赋给c2 */ printf(“%c %c\n”,c1,c2); /*以字符形式输出c1和c2的值*/ printf(“%d %d\n”,c1,c2); /*以整数形式输出c1和c2的值*/} • 程序运行结果:A C 65 67 • 可以看到:字符型数据和整型数据是通用的。它们既可以用字符形式输出(用%c),也可以用整数形式输出(用%d)。但是应注意字符数据只占一个字节,它只能存放0~255范围内的整数。
2.3.5 字符型变量 • 例2.4 大小写字母的转换。 #include <stdio.h>void main(){ char c1,c2; /* 定义c1,c2为字符型变量 */ c1=65; /* 将整数65赋给c1 */ c2=67; /* 将整数67赋给c2 */ printf(“%c %c\n”,c1,c2);/* 以字符形式输出c1和c2的值 */ printf(“%d %d\n”,c1,c2);/* 以整数形式输出c1和c2的值 */} • 程序运行结果:A B65 66a b97 98
2.3.5 字符型变量 • 例2.5 字符型和整型可以相互赋值。#include <stdio.h>void main(){ int k; /* 定义k为整型变量 */ char ch; /* 定义ch为字符型变量 */ k=‘b’; /* 将字符’b’赋给整型变量k */ ch=66; /* 将整数66赋给字符变量ch */ printf(“%d %c\n”,k,k);/* 以不同形式输出k的值 */ printf(“%d %c\n”,ch,ch); /* 以不同形式输出ch的值 */} • 程序运行结果:98 b66 B
2.3.6 基本数据类型描述 • 基本数据类型和基本数据类型加上修饰以后,各数据类型所占的内存空间字节数和所表示的数值范围。
2.4 程序举例 • 例2.5 实型数据的舍入误差。#include <stdio.h>void main(){ float a,b; /* 定义a和b为单精度实型变量 */ a=123456.789e5; /* 将123456.789e5赋给单精度实型变量a */ b=a+20; /* 将a的值加上20赋给单精度实型变量b */ printf("%f\n",a); /* 以实型形式输出a的值 */ printf("%f\n",b); /* 以实型形式输出b的值 */} 程序运行结果:12345678848.00000012345678848.000000由于实型变量是由有限的存储单元组成的,因此,能提供的有效数字总是有限的。
2.4 程序举例 • 例2.6 分析下面程序的运行结果。#include <stdio.h>void main(){ float a; /* 定义a为单精度实型变量 */ double b; /* 定义b为双精度实型变量 */ a=33333.33333; /* 将33333.33333赋给单精度实型变量a */ b=33333.33333333333333; /* 将33333.33333333333333 • 赋给双精度实型变量b*/ printf(“%f\n%f\n”,a,b); /* 以实型形式输出a和b的值 */} 程序运行结果:33333.332031 33333.333333 由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。b是双精度型,有效位为十六位。但Turbo C 规定小数后最多保留六位,其余部分四舍五入。
本 章 小 结 • 数据是程序处理的对象。在处理数据之前,要确定该数据处理类型和它是作为常量还是变量来使用。 • C语言提供了丰富的数据类型,其中的基本数据类型有整型、实型、字符型和枚举型。 • 常量是指在程序运行期间其值固定不变的量。常量有4类:整型常量、实型常量、字符型常量和字符串常量。程序中可以用符号来代替常量的值,从而使程序直观、易改。 • 变量是指在程序运行期间其值可以被改变的量。变量其实代表了某块存储空间。