首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

char类型的变量主要用于存储单个字符的编码,占用1个字节的内存。C++标准没有指定用于表示基本字符集的字符编码,所以这由编译器指定。但一般使用ASCII编码。

char类型的变量声明与其他类型的变量声明相同,如下所示:

char letter;

char yes, no;

第一个语句声明了一个char类型的变量letter,第二个语句声明了两个char类型的变量yes和no。这些变量都可以存储一个字符的编码。我们没有为这些变量提供初始值,所以它们包含垃圾值。

2.10.1 字符字面量

在声明char类型的变量时,可以用字符字面量初始化它。具体方法是把字符字面量编写为需要的字符,放在单引号中。例如,'z'、'3'和'?'都是字符字面量。

一些字符在输入为字面量时会出问题。显然,单引号表示起来就有点困难,因为它是字符字面量的界定符。实际上,在C++中,在单引号之间放置一个单引号或反斜杠字符是不合法的。控制字符如换行符和制表符也不好表示,因为它们会在按下相应字符健时换行或移动光标,而不会把该字符作为数据输入。使用以反斜杠开头的转义序列,可以指定所有这些问题字符,如表2-15所示。

表2-15 问题字符的转义序列

字 符

转 义 序 列

换行符

NL(LF)

\n

水平制表符

HT

\t

垂直制表符

VT

\v

退格

BS

\b

回车

CR

\r

换页

FF

\f

警铃

BEL

A

反斜杠

\

\\

单引号

'

\'

双引号

"

\"

问号

?

\?

要指定对应于这些字符的字符字面量,只需在单引号之间输入相应的转义序列,例如,换行符是'\n', 反斜杠是'\\'。

还有一些转义序列可以用于指定用八进制或十六进制值表示的字符编码。八进制字符编码的转义序列是一个反斜杠后跟三个八进制数。十六进制字符编码的转义序列是\x后跟一个或多个十六进制数。在定义字符字面量时,这两种形式都放在单引号中。例如,在US-ASCII编码中,字母'A'可以写为十六进制的'\x41',或八进制的'\81'。显然,可以编写不能放在一个字节中的编码,此时结果是实现方式已定义好的内容。

如果在单引号中编写了包含多个字符的字符字面量,这些字符不表示一个转义序列,例如'abc',该字面量就描述为多字符字面量,其类型为int。这种字面量的数字值是实现方式已定义好的内容,但通常是在int值的后续字节中放置字符的1字节编码。如果指定的多字符字面量多于四个字符,编译器通常会发出一个错误消息。

现在就可以使用字符字面量正确初始化char类型的变量了。

2.10.2 初始化char变量

下面的语句可以定义并初始化一个char类型的变量:

char letter='A'; //Stores a single letter 'A'

这个语句定义了char类型的变量letter,其初始值是'A'。如果编译器用US-ASCII码表示字符,该字符的十进制值就是65。

可以在一个语句中声明和初始化多个变量:

char yes=’y’, no = ‘n’, tab = ‘\t’;

因为可以把char类型的变量看作整型数,所以可以用下面的语句来声明和初始化变量letter:

char letter=65; //Stores the ASCII code for 'A'

char类型在默认情况下可以带符号,也可以不带符号,这取决于编译器,这会影响变量包含的数字值。如果char是不带符号的,其数字值将在0到255之间。如果它是带符号的,其值在–128到127之间。当然,可以存储的位模式的范围也是这样。它们的解释是不同的。

当然,可以把letter当作整型数来操作,所以可以编写下面的语句:

letter += 2;

这会使存储在letter中的值递增为67,也就是US-ASCII码中的'C'。本书最后的附录A列出了所有的ASCII码。

注释:

本例中假定使用US-ASCII编码,但不一定非如此不可。特别是在许多大型计算机上,字符用EBCDIC (Extended Binary Coded Decimal Interchange Code,扩充的二进制编码的十进制交换码)表示,这些码与US-ASCII编码是不同的。

可以显式地把变量声明为signed char或unsigned char类型,这两个修饰符会影响变量能表示的整数范围。例如,可以把变量声明为:

unsigned char ch =0U;

这里,数值的取值范围是0到255。

在从流中读取char类型的变量时,将存储第一个非空白的字符。也就是说,不能用这种方式读取空白字符,它们会被忽略。而且,不能把数值读入char类型的变量,如果这么做,会在变量中存储第一个数字的字符码。在屏幕上输出char类型的变量时,它会显示为一个字符,而不是数值。下面用一个例子来说明。

程序示例2.9—— 处理字符值

本例从键盘读取一个字符,输出该字符和对应的数值码,递增该字符的值,把结果输出为一个字符和对应的整数:

//Program 2.9–Handling character values

#include <iostream>

using std::cin;

using std::cout;

using std::endl;

int main() {

char ch=0;

int ch_value=0;

//Read a character from the keyboard

cout << " Enter a character: ";

cin >> ch;

ch_value=ch; //Get integer value of character

cout << endl

<< ch << " is " << ch_value;

ch_value=++ch; //Increment ch and store as integer

cout << endl

<< ch<< " is " << ch_value

<< endl;

return 0;

}

这个例子的结果如下所示:

Enter a character: w

w is 119

x is 120

例子的说明

在提示输入后,程序利用下面的语句从键盘上读取一个字符:

cin >> ch;

因为cin只接受非空白的字符,所以可以按下回车键,或输入空格和制表符,它们会被忽略。

输出流总是把变量ch输出为一个字符。为了获得该字符对应的数值,需要把它转换为整数类型,如下面的语句所示:

ch_value = ch; //Get integer value of character

编译器会把存储在ch中的值从char类型转换为int类型,使之能存储在变量ch_value中。第3章在讨论涉及不同类型的值的表达式时,将详细描述自动转换。

现在用下面的语句输出字符及其对应的整型数值:

cout << endl

<< ch << " is " << ch_value;

接着,把char类型的变量用作整型数:

ch_value = ++ch; //Increment ch and store as integer

这个语句递增ch的值,并把结果存储在变量ch_value中。这样就得到了下一个字符及其对应的数值表示。使用与前面相同的语句把这些结果显示出来。这里只递增了ch,而char类型的变量可以像整数类型一样,和所有的算术运算符一起使用。

2.10.3 使用扩展字符集

通常,单字节字符如ASCII或EBCDIC对使用拉丁字符的国家语言字符集来说足够了。还有8位字符编码包容其他语言,如希腊语和俄语。但是,如果要同时使用这些语言和拉丁字符,或者要处理亚洲语言的字符集,它们需要的字符编码比ASCII字符集多得多,256个字符编码就远远不够了。

类型wchar_t是一种字符类型,它可以存储实现方式支持的最大扩展字符集中的所有成员。这个类型名来自于宽字符(wide characters),因为字符的范围比通常的单字节字符宽。Char类型则“比较窄”,因为可用的字符编码比较有限。C++标准没有设定wchar_t类型的变量的长度,只是它具有其他整数类型的特性。在PC上,它通常是2字节,其底层类型是unsigned short,在一些编译器中也可以是4字节,特别是在Unix工作站的实现方式中常常是4字节。

1. 宽字符字面量

定义宽字符字面量的方式与前面处理char类型的窄字符字面量相同,但要在字面量的前面加上前缀字母L,例如:

wchar_t wide_letter=L'Z';

此语句把变量wide_letter定义为wchar_t类型,并将其初始化为Z的宽字符表示。

键盘上可能没有表示其他国家语言字符的键,但仍可以使用十六进制表示法来创建它们。例如:

wchar_t wide_letter=L'\x0438'; //Cyrillic H

单引号中的值是一个转义序列,它可以利用字符代码的十六进制表示指定一个字符。反斜杠表示转义序列的开始,反斜杠之后的x表示该代码是十六进制的。没有x或X,就表示其后的字符应解释为八进制数字。

当然,也可以使用UCS字符字面量的记号法:

wchar_t wide_letter=L'\u0438'; //Cyrillic H

如果编译器支持4字节的UCS字符,也可以用指定为\Udddddddd(其中d是一个十六进制数字)的UCS字符来初始化wchar_t类型的变量。

2. 宽字符流

前面使用的流cin和cout都是窄字符流,它们只能处理由一个字节组成的字符,所以不能从cin中读取wchar_t类型的变量。<iostream>头文件定义了特殊的宽字符流wcin和wcout,用于宽字符的输入和输出。使用宽字符流的方式与窄字符流相同。例如,可以从wcin中读取一个宽字符,如下所示:

wchar_t wide_letter=0;

std::wcin>> wide_letter; //Read a wide character

可以把宽字符输出到wcout中,但这并不表示这种字符会正确显示。这取决于操作系统是否能识别该字符编码。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论