530 likes | 628 Views
第 2 章 常量和变量. 教学内容: 2.1 数据类型 2.2 常量 2.3 变量 2.4 数组 小结 教学重点: 变量和数组的使用方法. 整 型 int. 字符型 char. 基本数据类型. 实 型 float 双精度型 double. 实 型. 逻辑型 bool. C++ 的数据类型. 空值型 void. 数组 指针 结构 struct 联合 union 枚举 enum 类 class. 非基本数据类型.
E N D
第2章 常量和变量 教学内容: 2.1 数据类型 2.2 常量 2.3 变量 2.4 数组 小结 教学重点: 变量和数组的使用方法
整 型 int 字符型 char 基本数据类型 实 型 float 双精度型 double 实 型 逻辑型 bool C++的数据类型 空值型 void 数组 指针 结构 struct 联合 union 枚举 enum 类 class 非基本数据类型 图2-1 C++的数据结构 2.1 C++中的数据类型
C++对基本数据类型也分别进行了封装,称为内置数据类型,内置数据类型不仅定义了数据类型,还定义了常用操作。本节仅介绍各种基本数据类型的定义,常用操作将在后面介绍。 C++为强类型语言,所有数据的使用严格遵从“先说明后使用”的原则,以便编译器进行编译。 整型用来存放整数,整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。
字符型用来保存字符,存储的是该字符的ASCII码,占用一个字节。如大写字母A的ASCII码为65,在对应的一个字节中存放的就是65。字符型数据从本质上说也是整数,可以是任何一个8位二进制整数。字符型用来保存字符,存储的是该字符的ASCII码,占用一个字节。如大写字母A的ASCII码为65,在对应的一个字节中存放的就是65。字符型数据从本质上说也是整数,可以是任何一个8位二进制整数。 由于汉语系统字符很多,用ASCII字符集处理远远不够,因此又创立了双字节字符集(DBCS:double-byte character set),每个字符用两个字节来编码。为便于软件的国际化,国际上一些知名公司联合制定了新的宽字节字符标准——Unicode。该标准中所有字符都是双字节的,不同的语言和字符集分别占用其中一段代码。这种用统一编码处理西文、中文及其它语言符号,就是unicode码。C++同时也支持宽字符类型(wchar_t),或称双字节字符型。
实型和双精度型都用来存放实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数存放,包括尾数、数符和阶码。数的精度取决于尾数的位数,32位机上实型为23位(因规范化数的数码最高位恒为1,不必存储,实际为24位),双精度为52位。实型和双精度型都用来存放实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数存放,包括尾数、数符和阶码。数的精度取决于尾数的位数,32位机上实型为23位(因规范化数的数码最高位恒为1,不必存储,实际为24位),双精度为52位。 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++6.0中为1个字节。布尔型在运算中可以和整型相互转化,false对应为0,true对应为1或非0 空值型主要用来说明函数的返回值类型,将在函数一章中具体介绍。 基本数据类型还可以加上一些修饰词,包括:signed(有符号)、unsigned(无符号)、long(长)、short(短)。参见下表:
类 型 名 称 占用字节数 取 值 范 围 char 字符型 1 -128 127 signed char 有符号字符型 1 -128 127 unsiged char 无符号字符型 1 0 255 short [int] 短整型 2 -32768 32767 signed short [int] 有符号短整型 2 -32768 32767 unsigned short [int] 无符号短整型 2 0 65535 int 整型 4 -231(231-1) signed [int] 有符号整型 4 -231(231-1) unsigned [int] 无符号整型 4 0 (232-1) long [int] 长整型 4 -231(231-1) signed long [int] 有符号长整型 4 -231(231-1) unsigned long [int] 无符号长整型 4 0 (232-1) float 单精度浮点型 4 -1038 1038 VC++中所有基本数据类型
类型 名称 占用字节数 取值范围 double 双精度 浮点型 8 -10308 10308 long double 长双精度 浮点型 16 -104932104932 bool 布尔型 1 true,false void 空值型 0 无值
2.2 常量 • 常量,指程序中直接给出的量; • 常量的值在程序执行过程中保持不变;并且存储在程序区,而非数据区; • 2.2.1 常量的种类 • 根据取值和表示方法的不同,可分为以下几种: 1. 整型常量 2. 实型(浮点型)常量 3. 字符型常量 4. 字符串常量 5. 枚举常量
整型常量 • 即整数,可以有多种表示方法: 十进制表示法 八进制表示法 十六进制表示法 其他表示法
整数的十进制表示方法 十进制表示与我们熟悉的书写方式相同。 如 15 -24
整数的八进制表示 八进制表示以0开始,由数字07组成,用来表示一个八进制数。 如: 012 //八进制数12,即十进制数10 -0655 //八进制数-655,即十进制数-429
整数的十六进制表示 十六进制以0X(X大小写均可)开始,由数字09和字母AF(大小写均可)组成,用来表示一个十六进制数。 以下是一些常整数的例子: 0x32A //十六进制数32A,即十进制数810 -0x2fe0 //十六进制数-2fe0, //即十进制数-12256
整数的其他表示方法 整型常量还可以表示长整数和无符号整数。长整型常数以 L或 l结尾,无符号常整数以 U或 u结尾,以 U L或 L U(大小写均可)结尾则可表示无符号长整型常数。 例如: -84L //十进制长整数-84 026U //八进制表示的无符号整数26 0X32LU //十六进制表示的无符号长整型数32。
实型常量 • 包含小数点和10的幂的数为实型常量,有两种表示方法: (1)一般形式与平时书写形式相同,由数字 0 9和小数点组成。例如: 0.23 -125.76 0.0 .46 -35. (2) 指数形式(也称为科学表示法)表示为尾数乘以10的次方形式,由尾数、E或e和阶数组成。指数形式要求在E或e前面的尾数部分必须有数字,后面的指数部分必须为整数。 实型常量的末尾加后缀f或F表示单精度实型,否则表示双精度实型。 例 : 判断下列表示是否合法 123E12 1.43E3.5 3.14159D -.34e-2 3.14159f E4
字符型常量 字符常量是用单引号引起来的单个字符。在内存中保存的是字符的ASCII码值。在所有字符中,有些是可显示字符,通常就用单引号引起来表示:’a′//字符a ’@’//字符@ ’4’//字符4 ’ ’ //空格字符 有些是特殊情况字符,如不可显示的字符等,c++使用转义序列表示方法,如(详见表2-3,此处略): ’\n’//换行 ’\\’// 字符\
4. 字符串常量 • 用双引号引起来的若干个字符称为字符串常量。 • 例如:″I am a Chinese.″,″123″, ″a″ , • ″ ″ 字符串常量与字符型常量的区别 字符串常量”a” 占两个字节,存放’a′和’\0’, 值为0x6100 字符型常量’a’占一个字节, 存放’a’,值为0x61
5. 枚举常量 • 枚举型是对一些命名int常量的列举,列举表中的每一个标识符称为枚举符,枚举常量就是这些枚举符。使用枚举量需要定义枚举模式(枚举类型),使用模式定义枚举量。 • (1)枚举模式定义格式: • enum <枚举名> {<枚举表>}; • 例如:enum color {red,blue,yellow,black,white}; • 定义了枚举模式color,其中共有5个标识符,red的值默认为0,blue的值默认为1,……,white的值默认为4。各个枚举量的值也可显式定义,如P37定义的枚举模式day1. • (2)枚举量的定义(说明)格式: • enum <枚举名> <枚举量名表>; • 其中的关键字enum可以省略。 • 例如:color c1,c2,c3; 就定义了三个color型枚举量,每一个的值都可以是red、blue、…、white之一。
(3) 枚举模式与枚举量的定义合二而一定义方式: • enum <枚举名> {<枚举表>} <枚举量名表>; • 如前述定义的模式color及枚举量c1、c2、c3可如下定义: • enum color {red,blue,yellow,black,white}c1,c2,c3; • (4) 枚举量的值枚举量可以被赋以所定义的枚举列表中的任意值,如:c1=red;c2=yellow;c3=white;等,c1、c2、c3的值实际是0、2、4; • 枚举量不能直接赋以数值值,如c3=4;是错误的,如确需赋数值值,可用强制类型转换(后面介绍):c3=(color)4; • 使用枚举量可以增加程序的可读性。
2.2.2 常量的定义 • 1.使用const定义 • 格式为:const <类型说明符> <常量名>=<初始值>; • 例如: • const float PI=3.14159; • const int Number_of_Student=100; • 常量必须也只能在定义时进行初始化; • 常量初始化之后,不允许再被赋值; • 常量必须先定义后使用; • 常量存储在数据区,并且可以按地址访问,编译时系统对常量进行类型检查。
2.使用宏定义命令define定义常量 • 格式为:#define <常量名> <常量值> • 例2.1,分析下述程序输出结果,注意常量定义的方式。 • #include<iostream.h> • int add(int x,int y) • { return x+y; } • void main() • { const float f=6.9876f; • cout<<f<<endl; • int a=89; int b=1; • const int c=add(a,b); • cout<<c<<endl; • #define D a+b • cout<<D<<endl; • }
2.3 变 量 • 变量,在程序中是指可以改变值的量。 • 2.3.1 变量四要素 • 1. 变量名:变量的逻辑标识,是一个标识符,由用户定义与管理,是用户眼中的变量。 • 2. 变量的内存地址:变量的物理标识,是一个无符号整数,由编译系统和操作系统进行分配和管理,是计算机眼中的变量。 • 3. 变量的类型:在用户眼中是变量的值的范围,在计算机的眼中是变量分配内存单元的多少及存储方式。 • 4. 变量的值:变量的内容,是用户处理的数据,注意区分变量的值与变量的地址,严格来说,都是数字,但含义大不一样。
2.3.2 变量的存储类型 • 1. 4种不同的存储类型变量 • ① 自动变量(动态变量)存储在动态区,格式为: • auto 变量类型 变量名列表; • 关键字auto 可以省略。 • 例如:auto int a=1; 就定义了动态整型变量 a,其初值为1。 • ② 外部变量(又叫全局变量),定义在函数体外,在函数体中使用前要说明。 • 定义格式为:变量类型 变量名表; • 说明格式为:extern 变量类型 变量名表; • ③ 寄存器变量,存储在寄存器中,定义格式为: • register 变量类型 变量名列表; • ④ 静态存储变量,存放在静态区,分内部、外部两种,定义格式为:static 变量类型 变量名列表; • 定义在函数体内或分程序内的静态存储变量为内部的,否则为外部的。
自动类(auto) 寄存器类(register) 局部变量:在函数体内或分程序内定义的变量。 内部静态存储类(static) 外部静态存储类(static) 全局变量:在函数体外定义的变量。 外部存储类(extern)
(1)、自动类(auto) #include <iostream.h> void main() { auto int a; //auto可以省略 cout<<a<<endl; } 输出结果: 一个不确定的值
(2)、寄存器类(register) #include <iostream.h> void main() { register int a; cout<<a<<endl; } 输出结果: 一个不确定的值
(3)、内部静态存储类(static) #include <iostream.h> void main() { static int a; cout<<a<<endl; } 输出结果: 0
(4)、外部静态存储类(static) #include <iostream.h> static int a; void main() { cout<<a<<endl; } 输出结果: 0
(5)、外部存储类(extern) #include <iostream.h> int a; void main() { cout<<a<<endl; } 输出结果: 0
2. 变量的作用域 • 变量的作用域是指变量的可使用的范围。范围之外,这些变量不可使用。 • ① 自动、寄存器、内部静态的变量的作用域是定义它的函数体或分程序内部; • ② 外部静态变量的作用域是定义它的文件内从定义处至文件未 • ③ 外部存储变量的作用域是整个程序内部及包含该程序的所有文件。 • 3. 变量的寿命(生存期) • 指的是从系统给该变量分配存储空间开始,到系统收回该变量占有的存储空间为止的时间。 • 外部变量、静态变量均存储在静态区,其寿命最长,与整个程序同在;寄存器变量、动态变量寿命较短,与其作用域相同。 • 静态变量得生存期一般比其作用域大,在其作用域内,变量可用,在其作用域外的生存期内,变量存在而不可用,称之为“冬眠”。
2.3.3 变量的定义(说明)格式和输入输出操作 在C++中,变量说明的一般格式为: 存储类 数据类型 变量名1,变量名2, ,变量名n; • 1.定义格式 下面是变量说明的几个例子: int i, j, k; //说明三个整型变量i, j, k float x, y, z; //说明三个实型变量x, y, z char c1, c2; //说明两个字符型变量c1, c2 double dx; //说明一个双精度型变量dx static int a=10; //定义变量a为静态整型,初值为10 ① 存储类型auto 可以省略。 ② 外部变量不用存储类型说明 ③ 数据类型不能省略 ④ 省略存储类型时,函数体内定义的为自动类,函数体外定义的为外部类。
2.变量赋初值和赋值 (1)变量在定义时获取值称为赋初值,或称初始化。 例如: int a=3,b=4,c=5; 也可写成:int a(3), b(4), c(5); float x=3.0; 也可写成:float x(3.0); (2)变量赋值 用赋值语句赋值。 例如: float x, e; x=3.5; e=2.71828; 未给变量赋初值,也未赋值的,外部类、静态类有默认值0;自动类、寄存器类无默认值,不能使用。
3.变量的输入输出 • 变量的输入输出依靠提取符(>>)、插入符(<<)实现,也可使用专用函数。 • 【例2.2】 观察程序运行情况,注意变量输入输出方式。 • #include<iostream.h> • void main() • { char c1=‘a’,c2=‘b’; int i1,i2; i1=i2=5; • double d1,d2; cout<<“输入d1、d2:”; • cin>>d1>>d2; • cout<<c1-c2<<‘,’<<c1+c2<<endl; • cout<<i1-i2<<‘,’<<i1+i2<<endl; • cout<<d1-d2<<‘,’<<d1+d2<<endl; • }
例2.3 观察下述程序输入结果,注意静态变量的特点。 • #include<iostream.h> • void fun(); //声明主函数中调用的函数fun在后面定义 • void main() { fun();fun(); } • void fun() • { int a=5; //a为整型自动变量 • a=2*a; • static int b=10; //b为内部整型静态变量 • b=2*b; • cout<<a+b<<endl; • } • 主函数中第一次调用fun,输出结果为30,调用结束后变量a被撤销,变量b开始“冬眠” ; • 第二次调用fun,a是重新生成的,初值为5,b是“冬眠”后被“唤醒”的,初值是上次结束时的值20,第二次调用的输出结果为50。
2.4 数组 • 数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置区分,位置用下标表示。 • 例如数列或向量就可以看作一个数组,其中的元素用一个下标即可确定。 • 矩阵也可看作一个数组,其中的元素需要用“行”、“列”两个下标确定。 • 数组下标的个数称作维数,上述代表数列的数组和代表矩阵的数组分别称为一维数组和二维数组。
2.4.1 数组的定义格式和数组元素的表示方法 • 1、数组的定义格式: • <类型> <数组名> [<大小1>] [<大小2>]… • 2、数组元素的表示方法 • <数组名> [<下标表达式1>] [<下标表达式2>]…
一维数组 a[0]=-2; a[1]=7; a[2]=5; a[0] -2 4 Byte • int a[3]; a[1] 7 a[2] 5 内存 a[3]=4; a=-10 下标越界 X 不能给数组名赋值 X
一维数组 数组定义中的元素个数只能是一个非负整数。 例如:int m[5];//定义数组m, 其中有5个整数 const int N=3; float x[N];//数组x中有3个实数
一维数组 数组在存储单元中是按下标的顺序连续存放的,任何一个元素都可以单独访问,其标识方法是用数组名和下标联合进行的:<数组名>[<下标值>] 下标值可以是由整型表达式计算的值。C++中规定数组第一个元素的下标为0。
一维数组 C++中数组大小在编译时确定,编译系统按照定义,为数组分配一段连续的存储单元,这段单元的大小也是不能改变的,因此数组大小不能用变量定义,而只能是一个正整数常量。 下列定义是非法的: int count; float s[count];//数组个数不能是变量,且必//须在定义时指明; const float Num=3; int n[Num]; //数组个数不能是实数; 对数组的访问指的是对数组元素的访问,不能直接将数组名作为访问对象,对数组赋值也必须对每一个元素逐个赋值。
二维数组 a[0][0] • int a[2][3]; • a[0][0]=1;a[0][1]=2; a[0][2]=3; • a[1][0]=4;a[1][1]=5;a[1][2]=6; a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
三维数组 • int a[2][3][4]; • 见书上第48页
2.4.2 数组的赋值 • 1、数组的赋初值 • int a[5]={1,2,3,4,5}; a[0] a[1] a[2] a[3] a[4]
b[0] • int b[6]={7,8,9}; b[1] b[2] b[3] b[4] b[5]
a[0][0] • int a[2][3]={{1,2,3},{4,5,6}}; • 相当于: • a[0][0]=1;b1[0][1]=2; a[0][2]=3; • a[1][0]=4;a[1][1]=5;a[1][2]=6; a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
a[0][0] a[0][1] • int b[3][3]={{1,2},{3}}; • 相当于: • b[0][0]=1;b[0][1]=2;b[0][2]=0; • b[1][0]=3;b[1][1]=0;b[1][2]=0; • b[2][0]=0;b[2][1]=0;b[2][2]=0; a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2]
int c[2][3][4]={{{1},{2}},{{3,4},{5,6}}}; • 数组c有24个元素,其中 • c[0][0][0]=1,c[0][1][0]=2,c[1][0][0]=3, • c[1][0][1]=4,c[1][1][0]=5,c[1][1][1]=6, • 其余的18个元素值都为0。
2、数组的赋值 • int a[5]; • a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5; • double b[3]; • b[0]=1.2;b[1]=-5.4;b[2]=3.6;
int_arr[0]= int_arr[1]= int_arr[2]= int_arr[3]= 2.4.2 数组元素的赋值 例:数组元素赋值的简单程序。 # include <iostream.h> void main() { int int_arr[4]; int_arr[0]=1; int_arr[1]=1; int_arr[2]=2; int_arr[3]=int_arr[1]+int_arr[2]; cout<<int_arr[0]<<‘\n’; cout <<int_arr[1]<<‘\n’; cout<<int_arr[2]<<‘\n’; cout<<int_arr[3]<< ‘\n’; } 1+2=3 1 1 2 3 输出 1 1 2 3
2.4.3 字符数组 如果数组中的元素为字符,就称为字符数组。例如: char string1[10];//可用来保存10个字符的字符数组; char city_name1[]={’ L’,’u’,’o’,’y’,’a’,’n’,’g’}; //可用来保存7个字符的字符数组; C++中字符数组用来保存字符串。允许直接用字符串常量给字符数组初始化。例如: char city_name2[]=”Luoyang”; 用字符串初始化,字符数组会自动加上一个串结束符‘\0’。串结束符在字符串操作中具有十分重要的意义,因此在定义字符数组大小时,要注意留出足够的空间保存串结束符。
数组的输入输出 【例2.4】分析下述程序的输入输出。 #include<iostream.h> void main() { int a[3]={7,8,9}; double b[2]; b[0]=1.2;b[1]=3.4; char c[4]; cout<<“输入4个字符:”; cin>>c[0]>>c[1]>>c[2]>>c[3]; cout<<a[0]<<‘,’<<a[1]<<‘,’<<a[2]<<endl; cout<<b[0]<<‘,’<<b[1]<<endl; cout<<c[0]<<‘,’<<c[2]<<endl; } 在VC++6.0环境下,演示该程序,注意输入输出。