本帖最后由 ReverseFuture 于 2015-1-8 13:39 编辑
在上一节中,我们共同学习了C++程序的组成元素,里面提到了我们这一节要共同学习的变量和基本数据类型。 我们知道,任何应用程序都需要进行数据处理,并需要一个地方来临时存储这些数据,这个存储数据的地方成为内存。一般说,内存中不同的位置可以通过唯一的内存地址来识别,我们使用这个地址来访问或者修改对应内存中的内容,编程语言中引入变量这个概念来简化对内存的访问。在本节中,我们共同学习以下几点: - C++中变量及其定义。
- C++中基本数据类型及其相互间的转换。
- C++程序中如何声明及使用变量和基本数据类型。
一、变量 在程序运行期间其值可以改变的量称为变量。一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。即变量名字和变量的值是两个不同的概念,其实变量名实质上代表的是内存地址,指示的是内存中的某个内存单元或连续的几个内存单元。 变量的命名规则同标识符的命名规则一样,在上一节中我们已经学习过,这里我们再次说明下,C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。变量名一方面要符合标识符的定义规范,另一方面不能为系统已经占用的关键字,而且对字母大小写敏感(即变量a同变量A不是同一个)。下面给出变量名示例:
age, name2 , _ch , _st3r 都是合法的变量名 a.ge , 2name , _ch$ , #dd , C++ 都不是合法的变量名
1. 变量和为变量赋值 在C++语言中,要求对所有用到的变量作强制定义,也就是必须“先定义,后使用”,定义变量的一般形式是: 其中,变量名表列指的是一个或多个变量名的序列,序列中的不同变量名之间用逗号隔开。接下来就可以为变量赋值,方法为: 变量名=变量值; (2) 此外,我们还可以在定义变量的时候直接给变量赋初值,形式为: 变量类型 变量名1=变量值1,变量名2=变量值2 …… ; (4) 示例代码如下:
2. const 其实还有一种量我们成为常变量(constant variable),其实常变量可以认为是一种特殊的变量,就是这个常变量的值一旦给定之后,在程序运行期间就再也不能改变。定义常变量非常简单,就是在定义变量时,在变量类型前面加上一个const标识符就可以定义一个常变量,而且在定义常变量时必须同时对它初始化(即指定其值),此后它的值不能再改变。例如:
const int a=3; //正确,用const来声明这种变量的值不能改变,指定其值始终为3 const int a; a=3; //错误,常变量定义时必须同时对它初始化
二、基本数据类型 计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数、浮点数、字符等形式)。数据类型是指我们定义变量时为变量指定的类型,它描述了我们定义的变量的基础特性,包括变量值的表示、存储空间的大小,以及对该值的操作。C++的数据类型包括基本数据类型和构造数据类型两种。当一个变量呗定义为某种类型时会受到系统对该类型的特别保护,确保其不受非法操作。在此出,我们只介绍C++的基本数据类型,构造数据类型将在以后的小节中另行学习。
图1 C++中数据类型分类
从上面的图中,我们也可以看出,C++中基本数据类型有如下四种: - 整型:说明符为int。
- 字符型:说明符为char。
- 浮点型(又称实型):说明符为float(单精度)、double(双精度)。
- 布尔型:其实就是逻辑类型,说明符为bool,只有两个取值:true和false。
为了满足各种情况的需要,上述的几种类型前面还可以加上修饰符来改变原来的含义和取值范围。主要有以下几种: - signed:表示有符号。
- unsigned:表示无符号。
- long:表示长型。
- short:表示短型。
上面四种修饰符都适用于整型和字符型,只有long还适用于双精度浮点型。如果在int整型数据类型前面还有类型修饰符如short、signed等时,则可以省略int。例如,shrot int则可以简写为short类型。 数据类型规定的存储空间都是按字节算的,其占用的字节数会根据机器字长的不同而有所变化,其实也就是跟系统的位数(例如32位或者64位)、C++编译器位数(例如32位或者64位)有关。下面表1中列出了C++中的基本数据类型在64位操作系统、32位编译器中占用内存字节数和取值范围情况。
我的系统是windows8 64位,IDE用的是Dev-C++,下面的代码就是用来验证C++中的基本数据类型在64位操作系统、32位编译器中占用内存字节数的程序及结果图。程序中的sizeof(datatype)运算符用来求取指定的数据类型(datatype可以为上表中我们列出的数据类型的任一种)在内存中所占用的字节数。
由上面表1中的信息和图中的运行结果可以知道,对比char和signed char、int和signed int、short和signed short,long和signed long我们可以发现其实它们中的每一对(例如char和signed char)的取值范围和占用字节数都是完全一样的,也就是说其实char和signed char是一样的,所以在以后的编程中,我们一般都直接写char,而不是写成signed char(少写个字母可以省事嘛,程序员都是很“懒”的,嘿嘿)。 下面我们分别学习这几种基本数据类型的变量的定义方法和使用举例。
1. 字符型(char)
字符型数据类型只占用1个字节,其声明的关键字为char。char型变量的声明方式为:
char 变量名; 变量名(例如ch)所代表的变量值可以取任意ASCII码值为-128~127的字符。声明字符型常量需要注意的是:用一对单引号括起来一个字符,单引号只是字符与其他部分的分隔符,并不是字符的一部分,并且不能用双引号代替单引号,而且单引号中的字符不能是单引号或反斜杠。例如:
‘a’ , ‘A’ , ‘#’ 这些都是合法的字符常量 ‘’’ , ‘\’ 这些都是非法字符常量 “A” ,"abcd" 不是字符常量
另一种表示字符常量的方法是转义字符。C++规定,采用反斜杠后跟一个字母来代表一个控制字符,具有新的含义。此外,用一对双引号括起来的一个或多个字符的序列成为字符串常量或字符串。字符串以双引号为定界符,双引号不作为字符串的一部分。C++中字符串的声明要用到以后我们要学习char型数组或者char型指针,我们留到以后再共同学习。字符串举例如下:
“Hello” ,”Happy New Year!” , “say \” hello!\”” 这些都是合法的字符串
字符串中的字符个数成为该字符串的长度,在存储字符串的时候,系统自动在字符串的末尾加上字符串结束标识符,即转义字符’\0’。例如以“Hello”作为例子来说,在内存中存储的形式为下图,图中每个格子代表一个内存单元,即一个字节。
示例程序如下,大家可以尝试修改程序中变量ch的值,看看结果如何。
2. 整型(int) 首先,我们先来学习整型数据类型。以整型(int)为中心的几种数据类型(unsigned int、short int、long int等)的情况我们在上面表中已经列出来了。下面,我们学习下如何定义指定整型类型的变量,以及如何使用。 我们定义了一个int类型的变量num(不记得怎么写合法的标识符了?可以回头看下 这一节),变量num的取值范围为-231~231-1,而且是只能取该范围内的整数,而不能是小数,其实这也是为什么我们称其为整型类型啦(只能取整数嘛)。不过整数也可以用几种不同的进制来表示嘛,例如可以用十进制、八进制、十六进制。C++中它们的书写形式分别如下所示(其实,还有二进制表示方法,只是C++中没有给出): - 十进制格式:由数字0到9和正、负号组成,书写时直接写出数字,例如:23,+43,-234等。
- 八进制格式:以数字0开头的数字(0~7)序列,例如:0123,0113等。
- 十六进制格式:以0x或0X(数字0和大写或小写字母x)开头的数字(0~9,a/A,b/B,c/C,d/D,e/E,f/F)序列,例如0x23,0x3E,0xEA等。
示例程序及运行结果如下:
大家可以尝试为程序中的num赋其他值(其他int取值范围内的整数值、负整数、小数、int取值范围外的其他值),例如赋一个小数值,看看结果如何,试着解释为什么会是这个结果。
3. 浮点型 浮点型数据也就是数学中的实数,当我们需要的数据有精度要求时才使用浮点型。C++中有两种浮点型:单精度浮点型(float)和双精度浮点型(double),它们的区别主要在于存储时在内存中占用字节数的不同,32位编译器中float为4字节,而double为8字节。 声明float型变量的方法: 声明double型变量的方法为: 浮点型数据使用方法举例程序及运行结果为:
4. 布尔型 布尔型是最简单的数据类型,它只有两个值true和false。所以,声明为布尔型的变量就只有两个逻辑值,即真(true)或假(false)。此外,如果要把一个整型变量转换成布尔型变量时,其对应关系如下: - 如果整型值为0,则其布尔型值为false。
- 如果整型值不为0,则其布尔值为true。
同样的,如果要把一个字符型变量或字符串转换成布尔型变量时,其对应关系如下: - 如果字符型值(或字符串)为空,则其布尔型值为false。
- 如果字符型值(或字符串)不为空,则其布尔值为true。
布尔型变量使用示例程序及运行结果如下:
说明:程序中的if…else语句是以后我们要学习的if条件语句,简单来说就是可以根据紧接if后面括号中的变量值的真和假来选择性 执行if分支的程序还是else分支的程序,此程序中是根据判断布尔型变量isMember的真和假来选择性执行不同语句。
如果isMember为真,则执行:
否则(即isMember为假)则执行:
三、类型转换
类型转换是用来把一个类型的值转换为另一种类型。C++是强类型的语言,即定义变量的时候一定要指定该变量的数据类型。C++中的数据类型转换支持隐式转换和显式转换。
1. 隐式转换
隐式转换就是系统默认的,不需要加以声明就可以进行的转换。隐式转换过程中,编译器无须对转换进行详细检查就能够安全地执行转换。比如从int类型转换到long时就是一种隐式转换。隐式转换一般不会失败,也不会导致信息丢失。
下面是一个将字符型变量隐式转换成整型变量的程序示例及运行结果:
上面的示例程序演示了将一个char类型的变量ch转换为int型变量i时的结果。通过打印结果我们可以看到,ch的值为字符a,而i的值为整数97。为什么说这个转换没有信息损失呢,那是因为字符a和整数97其实都是同一个量,只是它以不同的方式呈现在我们面前而已:以字符的形式显示则是字符a,而以整数的形式(ASCII码)显示时则是整数97。其实,每一个字母,不过大写还是小写都对应着各自的一个ASCII码。
2. 显式转换
下面学习显示转换。显示转换是程序员手动指出需要转换的目标类型,显式转换意味着编译器能够找到一个转换方式,但是它不保证这个转换是否安全,所以需要程序员额外指出需要转换到的目标类型。C++中可以直接在需要转换类型的变量前面直接添加一个括号,并在括号中给出需要转换到的目标类型,例如:char ch; int i = (int)ch;这里将char类型的ch变量显示转换为int数据类型。
下面是一个变量显示转换的程序示例及运行结果:
这个程序中,char型变量ch转换到int类型的情况跟上面隐式转换结果及原因一样,这里不再分析。而float类型变量num1转换到int型变量num2时,值由原来的12.34变成了现在的12,数据的精确度有所损失,即本来精确到小数点后两位的数现在却变成了精确到个位数了。
|