在为C语言编写代码时,我一直在寻找它的语法。我偶然发现了ANSI C Grammar (Lex)。在那里我找到了以下正则表达式(RE):
{CP}?"'"([^'\\\n]|{ES})+"'" { return I_CONSTANT; }
其中CP和ES如下
CP (u|U|L)
ES (\\(['"\?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))
我知道ES是转义序列的RE。
如果我正确理解正则表达式,则u'123'
或U'\n\t'
或L'abc'
有效I_CONSTANT
s。
我编写了以下小程序来查看它们代表的常量值。
#include <stdio.h>
int main(void) {
printf("%d %d %d\n", u'123', U'\n\t', L'abc');
return 0;
}
这给出了以下输出。
51 9 99
我破译他们代表单引号内最右边字符的ASCII值。 但是,我无法理解的是这种整数常数的用法和重要性。
答案 0 :(得分:3)
这些是多字符文字,它们的值是实现定义的。
从C11 6.4.4.4 p10-11:
包含多个字符(例如,&#39; ab&#39;)的整数字符常量的值,或者包含不映射到单字节执行字符的字符或转义序列的实现 - 是德网络定义。
...
包含多个多字节字符或单个多字节字符的宽字符常量的值,该字符映射到扩展执行字符集的多个成员,或包含未在扩展执行字符集中表示的多字节字符或转义序列,是实现 - 定义。
从你的测试来看,看起来GCC选择忽略广泛的多字符文字中除了最右边的字符之外的所有字符。但是,如果您未指定L
,u
或U
,GCC会根据结果的顺序将给定的字符组合为生成的整数的不同字节。在可移植代码中不应依赖此行为。