如果一元运算符的优先级接近最高,那么为什么 # 和 ## 运算符的计算顺序未指定?

If unary operators have near the highest priority, then why the order of evaluation of # and ## operators is unspecified?

简单问题:如果一元运算符的优先级接近最高,那么为什么 ### 运算符的求值顺序未指定?与 C 和 C++ 相关。

C11(6.10.3.2#运算符):

The order of evaluation of # and ## operators is unspecified.

C++,N4713(19.3.2 # 运算符):

The order of evaluation of # and ## operators is unspecified.

C++17 标准的第 19 章标题为“预处理指令”。它解释了预处理器的工作原理。

顾名思义,预处理器在其余 C 或 C++ 规则之前处理。所以运算符优先级不适用;这些不是导致表达式的运算符。 #define 宏定义中的预处理“运算符”### 不是 C 或 C++ 语言的一部分。它们是 C/C++ 预处理器的一部分;它们不是 C++17 标准第 8.3 节中定义的“一元运算符”。

在预处理器评估和宏操作期间,没有表达式。只有一个标记序列,宏系统为其定义了几个转换运算符(即 ###)。 C和C++的文法暂时还没有涉及到这个过程。

所以这个问题没有实际意义:它们的求值顺序是未指定的,因为它们与常规 C 或 C++ 运算符没有关系,并且标准说它们的顺序是未指定的。