字符类型声明与初始化
在C语言中,使用char
关键字来声明字符类型变量。例如:
char c = 'B'; // 声明并初始化字符变量c为'B'
此代码段展示了如何声明一个字符类型变量c
并赋予其值B
。
字符与单引号
C语言要求字符常量必须被单引号包围,如 'B'
。
字符的内部表示
字符在计算机内用一个字节(8位)存储,被视为整数,遵循ASCII编码。例如,字符'B'
对应整数66
。
本质上,字符只是一种视觉效果,计算机存储的不是字符本身,而是字符对应的编码,这个编码是一个整数,称之为码点
。
字符类型的范围
不同系统中,字符类型的默认范围可能为-128至127或0至255,均覆盖了标准ASCII码范围。
注意,最大不能超过255,超出这个范围,无法正常显示。
int main()
{
char a = 266;
printf("这个字符是:%c\n", a); // 没有266对应的字符
return 0;
}
运行这段代码,可能会得到警告。
整数与字符的互换性
char c = 66; // 整数赋值给字符变量
char c = 'B'; // 直接赋值字符
上述两行代码效果相同,说明字符和相应整数之间可以互换。
字符变量的数学运算
字符类型变量间可进行数学运算,如同整数操作:
char a = 'B'; // a = 66
char b = 'C'; // b = 67
printf("%d\n", a + b); // 输出字符B和C对应的整数和,即133
这里,a
和b
相加的结果按整数输出。
注意,字符表示有符号整数时,最大不能超过127,字符声明时超出这个范围,会出现意外的结果。
int main()
{
char a = 133;
char b = 133;
printf("这个整数是 %d\n", a + b);
return 0;
}
对于上述代码,预期的结果是 266,但实际运行后的结果是 -246。
这是因为133已经超出了char类型的最大表示范围,计算时会溢出,溢出后a和b的值是 -123,所以计算结果是 -246。
133的溢出分析如下:
- 133的补码是10000101。
- 作为char类型,133超出范围,因为此时表示有符号整数,最高位(最左边的位)是符号位,1 表示这是一个负数。
- 对于负数,剩余的位表示该数的补码形式。
- 补码减一得到反码,10000101减1的结果是10000100,此即为反码。
- 根据反码得到原码的过程是这样的:除符号位外,逐位取反。故10000100的原码是11111011。
11111011是-123的原码,即10000101是负数-123的补码。
转义字符
特殊字符,如单引号,需用反斜杠\
转义:
char t = '\''; // 使用转义表示单引号字符
控制字符如换行\n
,可通过转义序列表示,用于控制输出格式或执行特定操作,主要用来表示 ASCII 码定义的一些无法打印的控制字符,它们也属于字符类型的值。
\a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
\b:退格键,光标回退一个字符,但不删除字符。
\f:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v。
\n:换行符。
\r:回车符,光标移到同一行的开头。
\t:制表符,光标移到下一个水平制表位,通常是下一个8的倍数。
\v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
\0:null 字符,代表没有内容。注意,这个值不等于数字0。
八进制与十六进制表示字符
字符可以用八进制或十六进制表示:
char x = 'B'; // 直接字符赋值
char x = 66; // 整数赋值
char x = '\102'; // 八进制表示字符B
char x = '\x42'; // 十六进制表示字符B
这四种方式都正确地初始化变量x
为字符'B'
,展示了字符赋值的多样性。