您的位置:首页 > 其它

C Primer Plus-char类型

2015-01-25 18:34 183 查看
char类型用于存储字母和标点符号之类的字符。

但是在技术实现上char却是整数类型,这是因为char类型实际存储的是整数而不是字符。

标准的ASCII码值得范围从0到127,只需7位即可表示。而char类型通常定义为使用8位内存单元,该大小容纳标准ASCII编码是戳戳有余的。

char grade = 'A';
单引号中的一个字符是C的一个字符常量,编译器遇到 'A' 时会将其转换为相应的编码值65,其中单引号是必不可少的。

char a;
char b = 'T';  //可以
char c = T;  //不可以 T被当成一个变量
char d = "T";  //不可以  "T"被当作字符串
char grade = 65;  //也是可以的  不过编码风格不好
上面语句中65是int类型,但它在char类型大小范围之内,所以这样的赋值完全允许。

这个结果的假设是系统使用ASCII码。而使用'A'代替65进行赋值则可以在任意系统中正常工作,因此推荐使用字符常量而不是数值编码。

C将字符常量视为int类型而非char类型。例如,在int类型为32位和char类型为8位的ASCII系统中

char grade = 'B';
意味着'B'作为数值66存储在一个32位单元中,而复制之后的grade则把66存储在一个8位单元中。利用这个特性,可以定义个字符常量'FATE',这将把4个独立的8位ASCII码存储在一个32位的单元中,然而,如果把这个字符常量赋给一个char变量,那么只有最后8位会起作用,因此变量值为'E'。

单引号技术适用于字符,数字和标点符号,但是有些ASCII是打印不出来的,例如退格,换行或者终端响铃。C提供三种方法

例如,蜂鸣字符的ASCII值为7,所以可以这样:

char beep = 7;
第二种:使用特殊的符号序列



给一个字符变量赋值,转义序列必须用单引号括起来

char beep = '\n';
这样打印变量在屏幕上表现为换行。

如果编译器不识别警报字符(\a),可以使用ASCII码代替。

char beep = '\007';
可以省去前面的0,就是说'\07'和'\7'都可以。即使没有前缀0,这种写法会使数值被解释为八进制数。

从C90开始,C提供了第三种选择,即使用十六进制形式表示字符常量。在这种形式中,反斜杠后跟一个x或X,再加上1到3位的十六进制数字。例如Ctrl+P字符的十六进制ASCII码值为10,它可以表示为'\x10'或'\X010'。



使用ASCII码时要注意数字和数字字符的区别。例如字符4的ASCII码值为52。写法'4',表示符号4而不是数值4。

无论普通字符还是转义序列,如果作为双引号中字符集合的一部分,则无需单引号。双引号中的字符集合称为字符串。

printf("hello \007\n");
将打印出hello 并发出一声蜂鸣,而

printf("hello 7\n");
则打印出hello 7。不在转义字符中的数字将像普通字符那样被打印出来。

如果要在某个转义序列和其对应的ASCII码之间做出选择,则应当使用转移序列。比如选择'\f' 而不是'\014'

当需要使用数值编码时,为什么使用'\032'而不是032,因为'\032'更能清晰的表达程序员表示一个字符编码的意图;其次'\032'这样的转义序列可以嵌入到C字符串中。



一些C实现会把char当作有符号类型。取值范围为-128到127。另一些C实现会把char当作无符号类型,取值范围为0到255;

C90标准允许char前使用signed和unsigned修饰。这对于使用字符类型处理小整数十分有用。如果处理字符,则只需使用不带修饰词的标准char类型。

_Bool类型由C99引入,用于表示布尔值。

inttypes.h

C99提供了一个可选的名字集合,例如:int16_t表示一个16位的有符号证书类型,uint32_t表示一个32位无符号整数类型。

与int不同,uint32_t不是关键字,所以必须在程序中包含inttypes.h头文件,编译器才能识别它。

C使你可以通过f或F后缀使编译器把浮点常量当作float类型,比如2.3f和9.12F。没有后缀的浮点常量为double类型。

%f格式说明符打印十进制的float和double数字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: