C语言的字符char类型( 二 )


接下来的3个转义序列(\、'、")用于打印、'、"字符(由于这些字符用于定义字符常量,是printf()函数的一部分,若直接使用它们会造成混乱) 。如果打印下面一行内容:
Gramps sez, "ais a backslash."应这样编写代码:
printf("Gramps sez, "a \ is a backslash."n");: Gramps sez, "ais a backslash."表3.2中的最后两个转义序列(oo和\xhh)是ASCII码的特殊表示 。如果要用八进制ASCII码表示一个字符,可以在编码值前面加一个反斜杠()并用单引号括起来 。例如,如果编译器不识别警报字符(a),可以使用ASCII码来代替:
beep = '07'可以省略前面的0,'7'甚至'7'都可以 。即使没有前缀0,编译器在处理这种写法时,仍会解释为八进制 。
从C90开始,不仅可以用十进制、八进制形式表示字符常量,C语言还提供了第3种选择—用十六进制形式表示字符常量,即反斜杠后面跟一个x或X,再加上1~3位十六进制数字 。例如,Ctrl+P字符的ASCII十六进制码是10(相当于十进制的16),可表示为'\x10'或'\x010' 。图3.5列出了一些整数类型的不同进制形式 。

C语言的字符char类型

文章插图
Figure 3.5 Writing constants with the =int= family.
使用ASCII码时,注意数字和数字字符的区别 。例如,字符4对应的ASCII码是52 。'4'表示字符4,而不是数值4 。关于转义序列,读者可能有下面3个问题 。
- 上面最后一个例子(printf("Gramps sez, "a \ is abackslash."n"),为何没有用单引号把转义序列括起来?无论是普通字符还是转义序列,只要是双引号括起来的字符集合,就无需用单引号括起来 。双引号中的字符集合叫作字符串(详见第4章) 。注意,该例中的其他字符(G、r、a、m、p、s等)都没有用单引号括起来 。与此类似,printf("Hello!07n");将打印Hello!并发出一声蜂鸣,而printf("Hello!7n");则打印Hello!7 。不是转义序列中的数字将作为普通字符被打印出来 。
- 何时使用ASCII码?何时使用转义序列?如果要在转义序列(假设使用'f')和ASCII码('14')之间选择,请选择前者(即'f') 。这样的写法不仅更好记,而且可移植性更高 。'f'在不使用ASCII码的系统中,仍然有效 。
- 如果要使用ASCII码,为何要写成'32'而不是032?首先,'32'能更清晰地表达程序员使用字符编码的意图 。其次,类似32这样的转义序列可以嵌入C的字符串中,如printf("Hello!07n");中就嵌入了07 。
printf("Hello!62n");: Hello!24.打印字符printf()函数用%c指明待打印的字符 。前面介绍过,一个字符变量实际上被存储为1字节的整数值 。因此,如果用%d转换说明打印char类型变量的值,打印的是一个整数 。而%c转换说明告诉printf()打印该整数值对应的字符 。程序清单3.5演示了打印char类型变量的两种方式 。
/* charcode.c-displays code number for a character */#include <stdio.h>int main(void){char ch;printf("Please enter a character.n");scanf("%c", &ch);/* user inputs character */printf("The code for %c is %d.n", ch, ch);return 0;}# 运行该程序后,输出示例如下:Here is a sample run:Please enter a character.CThe code for C is 67.运行该程序时,在输入字母后不要忘记按下Enter或Return键 。随后,scanf()函数会读取用户输入的字符,&符号表示把输入的字符赋给变量ch 。接着,printf()函数打印ch的值两次,第1次打印一个字符(对应代码中的%c),第2次打印一个十进制整数值(对应代码中的%d) 。注意,printf()函数中的转换说明决定了数据的显示方式,而不是数据的存储方式(见图3.6) 。
C语言的字符char类型

文章插图
Figure 3.6 Data display versus data storage.
5.有符号还是无符号有些C编译器把char实现为有符号类型,这意味着char可表示的范围是-128~127 。
而有些C编译器把char实现为无符号类型,那么char可表示的范围是0~255 。请查阅相应的编译器手册,确定正在使用的编译器如何实现char类型 。或者,可以查阅limits.h头文件 。下一章将详细介绍头文件的内容 。根据C90标准,C语言允许在关键字char前面使用signed或unsigned 。这样,无论编译器默认char是什么类型,signed char表示有符号类型,而unsigned char表示无符号类型 。这在用char类型处理小整数时很有用 。如果只用char处理字符,那么char前面无需使用任何修饰符 。


推荐阅读