参考C Primer Plus学习
char类型用于存储字符,但是从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。
C语言把1字节定义为char类型占用的位(bit)数,因此无论是16位还是32位系统,都可以使用char类型。
char类型变量的声明方式与其他类型变量的声明方式相同。
char response;
char itable,latan;
以上声明创建了3个char类型的变量:respond、itable和latan。
如果要把一个字符常量初始化为字母“A”,不必背下char,用计算机语言很容易做到:
char grade='A';
在C语言中,用单引号括起来的单个字符被称为字符常量。编译器一发现'A',就会将其转换成相应的代码值。单引号必不可少。
char broiled; /*声明一个char类型的变量*/
broiled='T'; /*为其赋值,正确*/
broiled=T; /*错误!此时T是一个变量*/
broiled="T"; /*错误!此时“T”是一个字符串*/
实际上,字符是以数值形式存储的,所以也可以使用 数字代码值来赋值:
char grade=65; /*一种不好的编程风格*/
在本例中,虽然65是int类型,但是它在char类型能表示的范围内,所以将其赋值给grade没问题。
由于65是字母A对应的ASCⅡ码,因此本例是把A赋值给grade。注意,这样做的前提是系统使用ASCⅡ码。其实,用·'A'代替65才是较为稳妥的做法。因此,最好使用字符常量,而不是数字码值。
C语言将字符常量视为int类型而非char类型。例如,在int为32位、char为8位的ASCⅡ系统中:
char grade='B';
本来‘B’对应的数值66储存在32位的存储单元中,现在却可以储存在8位的存储单元中(grade)。
单引号只适用于字符、数字和标点符号,浏览ASCⅡ表会发现,有些ASCⅡ字符打印不出来。例如,一些代表行为的字符(如,退格、换行、终端响铃或蜂鸣)。C语言提供了3种方法表示这些字符。
1.使用ASCⅡ码。例如,蜂鸣字符的ASCⅡ值是7,因此可以写为:
char beep=7;
2.使用特殊的符号序列表示一些特殊的字符。这些符号序列叫做转义序列。
把转义序列赋给字符变量时,必须用单引号把转义序列括起来:
char nerf='\n';
稍后打印变量nerf的效果是,在打印机或者屏幕上另起一行。
转义序列 | 含义 |
\a | 警报 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠(\) |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
\0oo | 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数) |
\xhh | 十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数) |
这三个转义序列(\\、\'、\")用于打印\、'、"字符 。
如果打印:"Gramps sez,\"a\\is a backslash\"
应这样编写代码:printf("Gramps sez,\"a\\is a backslash\"\"n");
如果要用八进制ASCⅡ码表示一个字符,可以在编码前面加一个反斜杠(\)并用单引号括起来。例如,如果编译器不识别警报字符(\a),可以使用ASCⅡ码来代替:
beep='\007';
可以省略前面的0,'\07'甚至'\7'都可以。即使没有前缀0,编译器在处理这种写法时,仍会解释为八进制。
使用ASCⅡ码时,注意数字和数字字符的区别。例如,字符4对应的ASCⅡ码是52。'4'表示字符4,而不是数值4.
注意一些问题:
printf("Gramps sez,\"a\\is a backslash\"\"n"),为何没有用单引号把转义字符括起来?无论是普通字符还是转义字符,只要是双引号括起来的字符集合,就无需用单引号括起来。双引号中的字符合集叫做字符串。printf("Hello!\007\n");将打印Hello,并发出一声蜂鸣。printf("Hello!7\n");则打印Hello!7。不是转义字符中的数字将作为普通字符被打印出来。
何时使用ASCⅡ码?何时使用转义序列?如果要在转义序列(假设使用'\f')和ASCⅡ码('\014')之间选择,请选择前者。不仅更好记,而且可移植性更高。'\f'在不使用ASCⅡ码的系统中,仍然有效。
如果要使用ASCⅡ码,为何要写成'\032'而不是032?'\032'能更清晰的表达程序员使用字符编码的意图。
printf()函数用%c指明待打印的字符。前面介绍过,一个字符变量实际上被储存为1字节的整数值。因此,如果用%d 转换说明打印 char 类型变量的值,打印的是一个整数。而%c转换说明告诉printf()打印该整数值对应的字符。
#include
int main(void)
{
char ch;
printf("Please enter a character.\n");
scanf("%c",&ch); /* 用户输入字符 */
printf("The code for %c is %d.\n", ch, ch);
return 0;
}
运行该程序后,输出示例如下:
Please enter a character.
C
The code for C is 67.
运行该程序时,在输入字母后不要忘记按下 Enter 或Return 键。随后,scanf()函数会读取用户入的字符,&符号表示把输入的字符赋给变量ch。接着,printf()函数打印 ch 的值两次,第1次打印个字符(对应代码中的8c),第2次打印一个十进制整数值(对应代码中的gd)。注意,printf()函数的转换说明决定了数据的显示方式,而不是数据的储存方式。
数据显示和数据存储
有些C编译器把char 实现为有符号类型,这意味着char可表示的范围是-128~127。而有些C编译器把 char实现为无符号类型,那么char 可表示的范围是0~255。请查阅相应的编译器手册,确定正在使用的编译器如何实现 char 类型。或者,可以查阅1imits.h头文件。
根据C90标准,C语言允许在关键字char前面使用signed 或unsigned。这样,无论编译器默认char 是什么类型,signed char 表示有符号类型,而unsigned char 表示无符号类型。这在用char类型处理小整数时很有用。如果只用char处理字符,那么char 前面无需使用任何修饰符。