写 C 语言作业时,把 'A' 写成双引号包起来的形式会编译报错或者输出一串奇怪的东西,老师一句「字符常量用单引号」就带过了。其实这两种写法在内存里差着一个结束符。

字符常量是用单引号括起来的单个字符,比如 'A'、'7'、'#'。它在程序里代表这个字符对应的编码值,ASCII 环境下 'A' 是 65,'a' 是 97,'0' 是 48。注意 '0' 和数字 0 不是一回事,前者是字符,后者是数值。

单引号和双引号的区别

'A' 是字符常量,占一个字节;双引号包起来的 A 是字符串,占两个字节,末尾多一个结束符。用 putchar('A') 输出一个字符,输出字符串则要双引号。混用的时候编译器一般会给警告,别当成没事。

字符常量里的单引号是语法的一部分,不是字符本身;要表示单引号这个字符,得用转义写法。双引号字符串里则可以正常写单引号,不用转义。

转义字符怎么写

换行、制表这些看不见的字符,用转义字符表示,写法是反斜杠后面跟一个字母,比如反斜杠加 n 表示换行,反斜杠加 t 表示制表。单引号本身也可以写成转义形式,避免和常量的边界混淆。反斜杠加 0 在字符串里表示结束,不要拿它当普通字符用。

#include <stdio.h> int main(void) { char c = 'A'; putchar(c); return 0; }

字符常量的类型在 C 里是 int,在 C++ 里是 char,做算术时会自动参与运算,比如 'A' + 1 得到 66。用 sizeof('A') 在 C 里得到的通常是 4,在 C++ 里通常是 1,这个差异在跨语言移植时容易踩坑。

把字符常量赋给 char 变量时,超出范围的值会被截断,编译器一般会警告。做加密或编码转换时尤其要留意 signed char 和 unsigned char 的区别。写判断时别把 '0' 和 0 混着用,这是新手最常见的坑。

还要注意中文全角字符不能塞进单引号,一个汉字在不同编码下占多个字节,写进字符常量编译器会报多字符常量的警告。需要处理中文就用字符串或宽字符类型。