数据和C

参考C Primer Plus学习

文章目录

  • 使用字符:char类型
    • 1.声明char类型变量
    • 2.字符常量和初始化
    • 3.非打印字符
    • 4.打印字符
    • 5.有符号还是无符号


1.使用字符:char类型

        char类型用于存储字符,但是从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。

        C语言把1字节定义为char类型占用的位(bit)数,因此无论是16位还是32位系统,都可以使用char类型。

1.声明char类型变量

        char类型变量的声明方式与其他类型变量的声明方式相同。

        char response;

        char itable,latan;

        以上声明创建了3个char类型的变量:respond、itable和latan。

2.字符常量和初始化

        如果要把一个字符常量初始化为字母“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)。

3.非打印字符

        单引号只适用于字符、数字和标点符号,浏览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'能更清晰的表达程序员使用字符编码的意图。

4.打印字符

        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_第1张图片

 数据显示和数据存储

5.有符号还是无符号

        有些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 前面无需使用任何修饰符。

你可能感兴趣的:(c语言,开发语言)