这个问题在这里已有答案:
在为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值。但是,我无法理解的是这种整数常量的用法和重要性。
这些是多字符文字,它们的值是实现定义的。
从C11 6.4.4.4 p10-11:
包含多个字符(例如,'ab')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的。
...
包含多个多字节字符的宽字符常量的值或映射到扩展执行字符集的多个成员的单个多字节字符,或包含未在扩展执行字符集中表示的多字节字符或转义序列的实现 - 德网络定义。
从你的测试来看,看起来GCC选择忽略广泛的多字符文字中除了最右边的字符之外的所有字符。但是,如果您未指定L
,u
或U
,GCC将根据结果的顺序将给定的字符组合为生成的整数的不同字节。在可移植代码中不应依赖此行为。