在做C语言词法分析器的时候遇到了字符常量识别的问题。在这里讨论一下一般字符常量的词法规则,不设计宽字符和通用字符。
字符常量
C语言字符常量由单引号包含的一个或多个字符组成,包含多个字符时具体值与编译器有关(比如VS2019的编译器是获取最后一个字符)。 如:‘a’ ‘XY’ ‘0’ ‘*’
所有源代码字符集中的字符都可以成为字符常量,除了单引号、反斜线和换行符,这三个字符必须是用转义符表示:‘\’’ ‘\’ ‘\n’ 。在编译阶段,字符常量和字符串字面量中的字符和转义序列会转换成运行字符集中对应的字符。
字符常量的类型和值
对于所有非宽字符字符常量,类型为int,即C语言中字符常量和整型没有什么区别,可以混用。如下的代码都是可以正常运行的。
int a = 'P';char c = 80;
需注意的是,若采用带符号的char类型,那么字符常量的值可为负,如下:
int c = '\xA3';
printf("%c %d\r\n",c,c);
结果为£ -93 可以采用unsigned char这样值均为正数
转义符
转义序列 | 字符值 | 在输出设备上的动作 |
---|---|---|
\’ | 单引号 | 输出字符 |
\" | 双引号 | 输出字符 |
\? | 问号 | 输出字符 |
\\ | 反斜线 | 输出字符 |
\a | 警告 | 产生声音或者视觉信号 ,windows报错声音 |
\b | 退格 | 前移一个字符 |
\f | 换页 | 移动到下一页的开端 |
\n | 换行 | 移动到下一行开端 |
\r | 回车 | 移动到当前行开始 |
\t | 水平制表符 | 移动到下一个垂直的制表对齐点 |
\v | 垂直制表符 | 移动到下一个垂直的制表对齐点 |
\o,\oo,\ooo o为八进制字符 | 此八进制对应字符 | 输出字符 |
\xh,\xhh h为十六进制字符 | 次十六进制对应字符 | 输出字符 |
参考了C语言规范 第二版