字符的输入输出与双重性解析
char 类型在内存中本质存储的是整数(ASCII码),其表现形式是字符还是数字,完全取决于格式说明符和人为解释。
1. 字符的输入与输出
使用 scanf() 配合 %c 读取单个字符,使用 printf() 配合 %c 输出字符、配合 %d 输出其整数值(ASCII码)。
#include <stdio.h>
int main(void)
{
char ch = 0;
scanf("%c",&ch); // 读取单个字符
printf("\n%c",ch); // 按字符显示
printf("\n%d",ch); // 按数值显示
return 0;
}Code language: PHP (php)
核心概念:计算机只认内存中的二进制数(如 70)。用 %c 解释则显示为 'F',用 %d 解释则显示为数字 70。数据的含义是我们赋予它的。
2. 实例一:字符与不可见字符的输出(对应图1)
#include <stdio.h>
int main(void)
{
char first = 'T'; // ASCII 84
char second = 20; // ASCII 20 属于不可见控制字符(设备控制四)
printf("\n第一个例子以字符方式显示 - %c", first);
printf("\n第一个例子以数值方式显示 - %d", first);
printf("\n第二个例子以字符方式显示 - %c", second);
printf("\n第二个例子以数值方式显示 - %d\n", second);
return 0;
}Code language: PHP (php)
运行结果对照(与图1完全一致):
first为'T':字符显示T,数值显示84。second为20:数值显示20;字符显示时出现乱码/方块框(因为 20 是控制字符,终端无法打印可见图形,显示为占位符方框)。
3. 实例二:字符运算与整型提升(对应图2)
#include <stdio.h>
int main(void)
{
char first = 'A'; // 65
char second = 'B'; // 66
char last = 'Z'; // 90
char number = 40; // '('
char ex1 = first + 2; // 65+2=67 -> 'C'
char ex2 = second - 1; // 66-1=65 -> 'A'
char ex3 = last + 2; // 90+2=92 -> '\' (反斜杠)
printf("字符的值 %-5c%-5c%-5c", ex1, ex2, ex3);
printf("\n数值等价 %-5d%-5d%-5d", ex1, ex2, ex3);
printf("\n这个数值 %d 对应的字符 %c\n", number, number);
return 0;
}Code language: PHP (php)
运算与输出解析:
| 变量/表达式 | 计算过程(整型提升为int运算) | 截断存回char的值 | 字符显示 (%c) | 数值显示 (%d) |
|---|---|---|---|---|
ex1 | 'A'(65) + 2 | 67 | C | 67 |
ex2 | 'B'(66) - 1 | 65 | A | 65 |
ex3 | 'Z'(90) + 2 | 92 | “ (转义符) | 92 |
number | 直接赋值 40 | 40 | ( (左括号) | 40 |
运行结果对照(与图2完全一致):
- 字符行输出:
C A \`(注:` 为可见反斜杠,截图终端显示正常)。 - 数值行输出:
67 65 92。 - 末尾输出:
这个数值 40 对应的字符 (。
4. 核心规则与注意事项
| 机制 | 说明 |
|---|---|
| 输入/输出解释 | 内存数据不变,格式符 %c 映射为字符,%d 映射为整数。 |
| 算术运算 | char 参与运算先整型提升为 int,计算后截断回 char 赋值。 |
| 不可见字符 | 0~31 及 127 为控制字符,用 %c 输出通常显示空白或方框。 |
| 溢出/截断 | 运算结果超范围(如带符号 >127)会回绕成负数/乱码(如 ex3 的 92 仍在范围内)。 |