#
简单的问题:如果一元运算符的优先级接近最高,那么为什么和运算符的评估顺序##
未指定?与 C 和 C++ 相关。
C11(6.10.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
C++,N4713(19.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
#
简单的问题:如果一元运算符的优先级接近最高,那么为什么和运算符的评估顺序##
未指定?与 C 和 C++ 相关。
C11(6.10.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
C++,N4713(19.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
C++17 标准中的第 19 章标题为“预处理指令”。它解释了预处理器是如何工作的。
顾名思义,预处理器在 C 或 C++ 的其余规则之前处理。所以运算符优先级不适用;这些不是导致表达式的运算符。预处理“运算符”#
和宏定义##
中#define
不是 C 或 C++ 语言的一部分。它们是 C/C++ 预处理器的一部分;它们不是 C++17 标准第 8.3 节中定义的“一元运算符”。
在预处理器评估和宏操作期间,没有表达式。只有一个标记序列,宏系统为(即,#
和##
)定义了几个转换运算符。C 和 C++ 的语法尚未参与该过程。
所以这个问题没有实际意义:它们的评估顺序是未指定的,因为它们与常规的 C 或 C++ 运算符没有关系,并且标准说它们的顺序是未指定的。