c'

时间:2017-12-24 13:30:14

标签: c

在为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值。 但是,我无法理解的是这种整数常数的用法和重要性。

1 个答案:

答案 0 :(得分:3)

这些是多字符文字,它们的值是实现定义的。

从C11 6.4.4.4 p10-11:

  

包含多个字符(例如,&#39; ab&#39;)的整数字符常量的值,或者包含不映射到单字节执行字符的字符或转义序列的实现 - 是德网络定义。

...

  

包含多个多字节字符或单个多字节字符的宽字符常量的值,该字符映射到扩展执行字符集的多个成员,或包含未在扩展执行字符集中表示的多字节字符或转义序列,是实现 - 定义。

从你的测试来看,看起来GCC选择忽略广泛的多字符文字中除了最右边的字符之外的所有字符。但是,如果您未指定LuU,GCC会根据结果的顺序将给定的字符组合为生成的整数的不同字节。在可移植代码中不应依赖此行为。