C语言 字符常量

在做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语言规范 第二版

### C语言字符常量 在C语言中,**字符常量**是指单个字符,它通常用于表示ASCII码表中的某个特定字符字符常量需要用一对单引号括起来,例如 `'A'`、`'b'` 或者 `'$'`。 #### 字符常量的特点: 1. **单个字符**:每个字符常量只能包含一个字符。 ```c char ch = 'A'; // 正确的字符常量赋值 ``` 2. **转义字符**:某些特殊字符(如换行、制表符等)可以用反斜杠 `\` 加上相应的符号来表示,称为“转义序列”。常见的转义字符包括: - `\n`: 换行 - `\t`: 制表符 - `\\`: 反斜杠本身 - `\'`: 单引号 - `\"`: 双引号 示例: ```c char newline = '\n'; char tab = '\t'; printf("Hello\tWorld\n"); // 使用了两个转义字符 \t 和 \n ``` 3. **字符常量占用的空间**:虽然看起来像是只有一个字符,但实际上字符常量在内存中是以整数形式存储的,默认情况下是该字符对应的ASCII码值。因此,在大多数系统中,字符常量占1个字节。 4. **多字节字符(宽字符)**:对于一些非ASCII字符(如中文字符),可以使用宽字符类型 `wchar_t` 来处理。这需要引入 `< wchar.h >` 库,并使用特殊的前缀,比如 `L` 表示宽字符串。 5. **字符常量的数值运算**:由于字符常量本质上是一个整数,你可以对它们进行算术运算。例如: ```c char a = 'a'; char b = a + 1; // b 的值将是 'b' ``` 6. **字符常量与整型的关系**:字符常量可以直接参与整型运算,因为它们内部实际上是整数类型的 ASCII 码值。你也可以直接将字符转换成其对应的 ASCII 数值: ```c int asciiValueOfA = (int)'A'; // 将字符'A'转换为其ASCII值65 ``` --- ### 示例代码: ```c #include <stdio.h> int main() { char letter = 'Z'; printf("The character is %c and its ASCII value is %d.\n", letter, letter); // 转义字符演示 printf("First line\nSecond line with\ttab space.\n"); return 0; } ``` 运行结果: ``` The character is Z and its ASCII value is 90. First line Second line with tab space. ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值