2.3.4 字符串常量
C++语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双引号括起来的字符序列,简称为字符串。字符串常量中除一般字符外,还可以包含空格、转义序列符或其他字符(如汉字)等。例如:
"Hello, World!\n" "C++语言"
等都是合法的字符串常量。字符串常量的字符个数称为字符串长度。若只有一对双引号(“”),则这样的字符串常量的长度为0,称为空字符串。
书中表示字符串的一对双引号“”是汉字字符,在程序代码中是不可以的,它们只能用""来表示;类似的,一对单引号‘’在程序代码中也只能用''表示的。注意不要在程序代码中误用这些汉字字符。
由于双引号是字符串的分界符,因此如果需要在字符串中出现双引号则必须用“\"”表示。例如:
"Please press \"F1\"to help! "
这个字符串被解释为:
Please press "F1" to help!
字符串常量应尽量在同一行书写,若一行写不下,可用“\”来连接,例如:
"ABCD \ EFGHIGK... "
需要说明的是,对于整数、实数和字符常量来说,其数据类型是确定的,也就是说,当操作这些数据时,它们所需要的内存空间大小也是确定的。而字符串常量则不然,由于不同的字符串所包含的字符个数不一样,因而不同字符串所需的内存空间大小也各不相同。
为了能确定字符串操作时所需内存空间的大小,保证字符串在内存空间中存取的正确性,C++在将字符串的字符依次存放在内存空间后,还会在其后存入一个‘\0’字符。‘\0’用做字符串所占内存空间的结束标志,称为字符串的结束符。这样,当字符串从内存空间中依次提取时,首先判断取出的字符是否为结束符,若是,则字符串提取结束,从而保证了字符串存取的正确性。
讨论:若在字符串中指定‘\0’,则这样的字符串的长度和字节大小各为多少呢?例如:“AB\CD\t\0\n”。
当字符串存放在内存空间时,系统会将其所包含的字符连同结束符‘\0’依次存放,每个ASCII字符占1个字节,因此需要8个字节的内存空间,如图2.6所示。
但提取时,由于先遇到第一个‘\0’字符,C++就会将其视为结束标志,提取出来的字符串是第一个‘\0’前的字符序列,即“AB\CD\t”,因此该字符串的长度为5。
图2.6 字符串存储示意
需要强调的是,不要将字符常量和字符串常量混淆不清,它们的主要区别如下:
(1)字符常量用单引号括起来的,仅占 1个字节;而字符串常量是用双引号括起来的,至少需要两个字节,但空字符串除外,它只需要 1 个字节。例如:字符串“a”的字符个数为1,即长度为1,但它所需要的字节大小不是1而是2,因为除了字符a需要1个字节外,字符串结束符‘\0’还需1个字节,如图2.7所示。
图2.7 “a”和‘a’的区别
(2)内存中,字符是以 ASCII 码值来存储的,因此可将字符看做是整型常量的特殊形式,它可以参与常用的算术运算,而字符串常量则不能。例如:
int b='a'+3; // 结果b为100,这是因为‘a’的ASCII码值97参与了运算