根据 C 标准,负整数文字是解释为单个文字,还是运算符和文字?

Mar*_*cus 4 c parsing compilation numeric literals

C 标准/编译器如何将负整数解释为单个文字,或解释为(一元)运算符和数字文字?

例如,被-16解释为 a-16-(16)?

chu*_*ica 5

-16是两个标记:一个运算符-和一个值为 16 且类型为 的整数常量int


尝试下面。即使是库常量也是经过精心构建的,以避免-2147483648它具有相同的(-0x7fffffff-1)但它是一个更宽的类型,因为2147483648它超出了int范围。

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
puts(TOSTRING(INT_MIN));
Run Code Online (Sandbox Code Playgroud)

输出

(-0x7fffffff-1)
Run Code Online (Sandbox Code Playgroud)


Eri*_*hil 5

C 2018 6.4.4.1 1 显示整数常量的语法。它说整数常量是以下之一:

\n
    \n
  • 小数常量 整数后缀选项
  • \n
  • 八进制常量 整数后缀opt
  • \n
  • 十六进制常量 整数后缀opt
  • \n
\n

由于我们只对它们如何开始感兴趣,因此整数后缀与我们无关。下面的语法规则表明:

\n
    \n
  • 十进制常数以非零数字开头,它当然是12345678、 或之一9
  • \n
  • 进制常量以 开头0
  • \n
  • 十六进制常量0x以或开头0X
  • \n
\n

因此,没有以或开头的整数常量-+

\n

-16被解析为一元-运算符后跟整数常量16。这形成了 C 2018 6.6 6 中指定的整数常量表达式,其中表示:

\n
\n

\xe2\x80\xa6整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、sizeof字符常量、结果为整数常量的表达式、_Alignof表达式和作为强制转换的立即操作数的浮点常量的操作数\ xe2\x80\xa6

\n
\n