char类型不仅仅可以存储-128~127范围内的整数,更普遍的用法是存储一个字符。
一、字符串、字符、ASCII表
前面我们输出"Hello World",称"Hello World"是一句话,或者是一段文本,更专业的称谓是字符串。字符串就是有顺序的若干符号“串”在一起组成的文本,字符串中的每个符号就是字符。字符串"Hello World"中的字符依次是'H'、'e'、'l'、'l'、'o'、' '(空格)、'W'、'o'、'r'、'l'、'd'。字符的书写方法是用英文单引号将符号括起来。
char类型不仅仅可以存储-128~127范围内的整数,更普遍的用法是存储一个字符,包括大小写英文字母、数字符号和英文标点符号以及一些特殊意义的字符(不包括任何汉字),这些字符和0~127的整数一一对应。

这个表展示了字符与十进制数一一对应的关系,称之为ASCII表(American Standard Code for Information Interchange,美国信息交换标准代码)。第0个到第31个字符(也是十进制数0~31对应的字符)是控制字符(不可见字符),从第32个字符开始,每个整数对应一个打印字符(英文标点符号、数字、大小写字母等)。
仔细分析ASCII表,会发现字符与整数对应关系有以下特点:
- 大写字母
'A'与十进制数65对应,更普遍地,大写字母'A'~'Z'与十进制数65~90连续一一对应 - 小写字母
'a'与十进制数97对应,更普遍地,大写字母'a'~'z'与十进制数97~122连续一一对应 - 数字字符
'0'与十进制数48对应,更普遍地,数字字符'0'~'9'与十进制数48~57连续一一对应。需要注意的数字字符'0'与整数0不同,'0'是字符,0是int整数。例如字符串"result is 0",最后一个字符是数字字符'0'。
现在应该清楚'A'、"A"、A的区别了吧?'A'是字符,"A"是只包含一个字符的字符串、A可以理解为变量。
同样的,'1'是字符,"1"是只包含一个字符的字符串、1是整数常量。
二、char字符的本质——char字符与整数的关系
char类型的本质就是一个-128~127范围的整数,只不过char类型0~127范围内的整数与ASCII表中的字符一一对应。正是这个特点,char字符与0~127范围内的整数可以混合使用(相互赋值),甚至相互运算。参见下面测试程序:
#include<iostream>
using namespace std;
int main()
{
char ch1 = 'a';
char ch2 = 'b';
cout<<ch1<<" "<<ch2<<endl;
cout<<ch2-ch1<<endl; //两个char运算,实际是对应的整数参加运算
return 0;
}
#include<iostream>
using namespace std;
int main()
{
//int整数65赋值给char变量ch,赋值后变量ch就是十进制数65对应的字符'A'
char ch = 65;
cout<<ch<<endl; //ch是字符'A',但是输出时只会输出A,单引号不会输出
//char+int,类型自动转换后结果是int,char变量ch对应十进制数65参加计算,输出66
cout<<ch+1<<endl;
//先计算ch+1,结果是66,赋值给char变量ch,ch变成十进制数66对应的字符'B'
ch = ch+1;
cout<<ch<<endl; //输出B
return 0;
}
#include<iostream>
using namespace std;
int main()
{
//char字符'A'赋值给int变量,赋值后变量n就是字符'A'对应的十进制数65
int n = 'A';
cout<<n<<endl; //输出65
cout<<(char)n<<endl; //输出A(将int强制转换成char)
//char-int,类型自动转换后结果是int,'a'对应十进制数97参加计算,输出32
cout<<'a'-n<<endl;
n = n+1;
cout<<(char)n<<endl; //输出B
return 0;
}
三、char数据程序示例
例1:英文字母。大家知道有26个英文字母,其中A是第一个字母,编写程序求出:
- Q是字母表的第几个字母?
- 第20个字母是哪一个?
思路:char字符'A'~'Z'对应的整数是连续的,而且char类型的变量支持与整数直接进行数学计算。
#include<iostream>
using namespace std;
int main()
{
//'A'是第1个字母,'Q'应该是第('Q'-'A'+1)个字母
int ans1 = 'Q'-'A'+1;
//第n个字母是'A'+n-1,赋值给char类型变量
char ans2 = 'A'+20-1;
cout<<ans1<<endl<<ans2<<endl;
return 0;
}
例2:将输入的大写字母转换成对应的小写字母。
- 输入格式:1个大写字母(竞赛编程时,不需要考虑运行时输入不满足题目输入格式的情况,例如这里不需要考虑万一输入的字符不是大写字母这样的情况;当然,如果是编写实用软件,那就需要考虑这些情况,例如发现输入的字符不是大写字母时给出错误提示)
- 输出格式:1个字符,也就是输入的大写字母对应的小写字母
思路:大写字母'A'~'Z'对应的整数是连续的,小写字母'a'~'z'对应的整数也是连续的,并且小写字母对应的整数大于大写字母。

'a'-'A')#include<iostream>
using namespace std;
int main()
{
char ch1,ch2;
cin>>ch1;
ch2 = ch1+'a'-'A';
cout<<ch2<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
char ch1,ch2;
ch1 = getchar();
ch2 = ch1+'a'-'A';
cout<<ch2<<endl;
return 0;
}
除了使用cin输入char字符外,还可以通过getchar()函数输入char字符赋值给char变量。
试一试:编写程序将输入的小写字母转换成对应的大写字母。
例3:使用转义字符'\n'实现换行效果。
观察ASCII表,会发现有一些特殊的转义字符,例如'\n'、'\r'、'\t'等。转义字符特殊的原因是书写的时候“明明”是两个符号(以\开头再加另外一个符号),其实却是一个字符。如果要表示字符\,需要使用'\\'。其中常用的'\n'是换行符,'\t'是制表符,通过一段程序来测试'\n'的用途:
#include<iostream>
using namespace std;
int main()
{
//字符串"Hello\nWorld\n"中出现了两次换行符'\n'
cout<<"Hello\nWorld\n";
//字符串"\n"中有且仅有一个字符——换行符'\n'
cout<<123<<"\n"<<456<<endl;
//直接输出换行符'\n'
cout<<123<<'\n'<<456<<endl;
return 0;
}
程序运行结果如下:
Hello World 123 456 123 456
可知不管是单个'\n'还是字符串中有字符'\n',输出时'\n'都会产生换行的效果。
试一试:编写并运行下面程序,观察运行效果(确保可以听到计算机发出的声音):
#include<iostream>
using namespace std;
int main()
{
cout<<"Listen...\a"; //输出字符'\a'会发出声音
return 0;
}
NOIP学习小站