字符类型

类型为 char 的变量可以保存具体实现所用的字符集里的一个字符。例如,

    char ch = 'a';

实际情况中一个 char 类型几乎都包含 8 个二进制位,因此它可以保存 256 种不同的值。典型的情况是有关字符集采用ISO-646的某个变形,例如 ASCII,并由此提供了你键盘上的那些字符。这一字符集只是部分地标准化了,由此也引起了许多问题(C.3节)。

在支持不同自然语言的字符集之间存在着巨大的差异,以不同方式支持同一种自然语言的字符集之间也有类似情况。当然,我们在这里只对这些差异如何影响C++感兴趣,怎样在多语言、多字符集的环境中编写程序的事情已经超过了本书的范围,虽然这种事情也会在一些地方向我们招手(20.2节、21.7节、C.3.3节)。

假定实现所用的字符集包括数字、26个英文字母,以及某些基本标点符号是没问题的。而做出如下假定都是不安全的:在 8 位字符集中共有不超过 127 个字符(例如,有的字符集提供了 255 个字符),不存在超出英语的字母(大部分欧洲语言都提供了更多的字母),字母字符是连续排列的(EBCDIC在 'i' 和 'j' 之间留有空隙),写C++所需要的每个字符都是可用的(例如,有些国家的字符集中没有提供 {}[]|\;C.3.1节)。只要有可能,我们都应该避免做出有关对象表示方式的任何假定,这个普遍规则甚至也适用于字符。

每个字符常量有一个整数值。例如,在ASCII字符集里'b'的值是 98。这里是一个小程序,它可以告诉你,你仔细输入的任一个字符所对应的整数值是什么

    #include <iostream>
    int main()
    {
        char c;
        std::cin >> c;
        std::cout << "the value of'" << c << "' is " << int(c) << '\n';
    }

记法 int(c) 将给出字符 c 的整数值。能够把 char 转为整数也引起了一个问题:一个 char 是有符号的还是没符号的?由8个二进制位表示的256个值可以解释为整数值0~255,或者解释为-128~127。不幸的是,关于普通 char 如何选择的问题是由实现决定的(C.1节、C.3.4节)。C++提供了另外两个类型,它们都确切地回答了这个问题:signed char 保存的值是-128~127;而 unsigned char 保存的值是0~255。幸运的是,这方面的差异只出现在那些超出127的值,而最常用的字符都在127之内。

将超过上述范围的值存入普通的 char 将会导致微妙的移植性问题。如果你真的需要使用不止一种 char 类型,或者你需要将整数存储到 char 中,那么请读一读C.3.4节。

这里还提供了另一个类型 wchar_t,用于保存更大的字符集里的字符,例如 Unicode 的字符。这是另外一个独立的类型,wchar_t 的大小由实现确定,且保证足够存放具体实现所用的现场(21.7节、C.3.3节)所支持的最大的字符集。这个奇怪的名字来源于C。在C语言里,wchar_t 是一个 typedef(4.9.7节)而不是一个内部类型。加上后缀 _t 就是为了区分标准类型和 typedef

请注意,字符类型都是整型(4.1.1节),可以对它们使用算术和逻辑运算符(6.2节)。

🔚