VC++ 2008专题应用程序开发实例精讲
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 数据类型

C++是一种强类型语言,程序中的每个数据项都有一个与之相关的类型,该类型定义了数据项的含义。只要可能,C++编译器就会检查数据类型在给定的环境下是否正确,以及合并的不同类型是否兼容。进行这种类型检查,编译器就能检测并报告把一种类型的数据解释为另一种类型时可能发生的大多数错误,或尝试把不兼容的数据类型组合在一起而产生的错误。

在C++中,可以使用的数值分为两大类,即整型数和浮点数(可以是分数)。但是,并不能由此判断出只有两种数值数据类型。实际上,在每个大类中,还有几种数据类型,每种类型都有其可以存储的数值范围。

C++预定义了一组数值数据类型,可以用来表示整型数、浮点型数和单个字符,还预定义了用来表示字符串的字符数组。

· 字符型char:在典型情况下,用它表示单个字符和小整数。它可以用一个机器字节来表示。

· 整型int、短整型short、长整型long:它们分别代表不同长度的整型数值,在典型情况下,short以半个字表示,int以一个机器字表示,long为一个或两个机器字(在32位机器中,int和long通常长度相同)。

· 浮点型float、双精度double、长双精度long double:分别表示单精度浮点数、双精度浮点数和扩展精度的浮点数值。在典型情况下,float为一个字,double是两个字,long double为三个或四个字。

char、short、int和long称为有序类型(integral types)。有序类型可以有符号,也可以无符号。在有符号类型中,最左边的位是符号位,余下的位代表数值;在无符号类型中,所有的位都表示数值。如果符号位被置为1,数值将被解释成负数;如果是0,则为正数。一个8位有符号的char可以代表从-128到127的数值;一个无符号的char则表示从0到255范围内的数值。

当一个数值(例如1)出现在程序中时,它被称为文字常量(literal constant),称为“文字”是因为只能以它的值的形式提起它,称它为“常量”则是因为它的值不能被改变。每个文字都有相应的类型。例如,0是int型,而3.14159是double型的文字常量。文字常量是不可寻址的(nonaddressable),尽管它的值也存储在机器内存的某个地方,但是没有办法访问它们的地址。整数文字常量可以被写成十进制、八进制或者十六进制的形式(这不会改变该整数值的位序列)。例如,20可以被写成下面三种形式中的任意一种:

20       // 十进制
024      // 八进制
0x14     // 十六进制

在整型文字常量前面加一个0,该值将被解释成一个八进制数;在前面加一个0x或0X,会使一个整型文字常量被解释成十六进制数(第20章“输入/输出流库”将讨论八进制或十六进制形式的输出值)。

在默认情况下,整型文字常量被当做是一个int型的有符号值。可以在文字常量后面加一个“L”或“l”(字母L的大写形式或小写形式),将其指定为long类型。一般情况下,应该避免使用小写字母,因为它很容易被误当做数字1。类似地,可以在整型文字常量的后面加上“u”或“U”,将其指定为一个无符号数。也可以用“UL”指定无符号long型的文字常量。例如:

128u 1024UL 1L 8Lu

浮点型文字常量可以被写成科学计数法形式或普通的十进制形式。使用科学计数法,指数可写做“e”或“E”。浮点型文字常量在默认情况下被认为是double型,单精度文字常量由值后面的“f”或“F”来表示。类似地,扩展精度由值后面跟的“l”或“L”来指示(注意“f”、“F”、“l”和“L”后缀只能用在十进制形式中)。

例如:

3.14159F 0.1f 12.345L 0.0
3e1 1.0E-3 2. 1.0L

单词true和false是bool型的文字常量。例如,可以这样写:

true false

可打印的文字字符常量可以写成用单引号括起来的形式。例如:

'a' '2' ' , ' ' ' (空格)

一部分不可打印的字符、单引号、双引号及反斜杠可以用如下的转义序列来表示(转义序列以反斜杠开始):

newline(换行符)\n
horizontal tab(水平制表键)\t
vertical tab(垂直制表键)\v
backspace(退格键)\b
carriage return(回车键)\r
formfeed(进纸键)\f
alert(bell)(响铃符)\a
backslash(反斜杠键)\\
question mark(问号)\?
single quote(单引号)\'
double quote(双引号)\"

一般的转义序列采用如下格式:

\ooo

这里的ooo代表三个八进制数字组成的序列。八进制序列的值代表该字符在机器字符集里的数字值。下面的示例使用ASCII码字符集表示文字常量:

\7 (bell) \14 (newline)
\0 (null) \062 ('2' )

另外,字符文字前面可以加“L”,例如:

L' a'

它称为宽字符文字,类型为wchar_t。宽字符常量支持语言字符集合,如汉语和日语等,这些语言中的某些字符不能用单个字符来表示。

字符串文字常量由零个或多个用双引号括起来的字符组成。不可打印字符可以由相应的转义序列来表示。一个字符串文字可以扩展到多行。在一行的最后加上一个反斜杠,可表明字符串文字在下一行继续。例如:

"" (空字符串)
"a"
"\nCC\toptions\tfile.[cC]\n"
"a multi-line \
string literal signals its \
continuation with a backslash"

字符串文字的类型是常量字符数组。它由字符串文字本身及编译器加上的结束空(null)字符构成。例如:

'A’代表单个字符‘A' ,下面的表示则代表单个字符A后面跟一个空字符:
"A"

空字符是C和C++用来标记字符串结束的符号。与宽字符文字(比如L' a' )一样,C和C++中也有宽字符串文字,它仍然以“L”开头,如:

L"a wide string literal"

宽字符串文字的类型是常量宽字符的数组。它也有一个等价的宽空字符作为结束标志。如果两个字符串或宽字符串在程序中相邻,C++就会把它们连接在一起,并在最后加上一个空字符。例如:

"two" "some"

它们的输出结果是“twosome”。如果试图将一个字符串常量与一个宽字符串常量连接起来,会发生什么后果?例如:

//这不是一个好方法
"two" L"some"

结果是未定义的(undefined),即没有为这两种不同类型的连接定义标准行为。使用未定义行为的程序被称做是不可移植的。虽然程序可能在当前编译器中能正确执行,但是不能保证相同的程序在不同的编译器、或当前编译器的以后版本中编译后,仍然能够正确执行。在以前能够运行的程序中跟踪这类问题是一件很令人不快的任务。因此,建议不要使用未定义的程序特性。