0

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

C11(6.10.3.2 # 运算符):

# 和 ## 运算符的求值顺序未指定。

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

# 和 ## 运算符的求值顺序未指定。

4

1 回答 1

7

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

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

在预处理器评估和宏操作期间,没有表达式。只有一个标记序列,宏系统为(即,###)定义了几个转换运算符。C 和 C++ 的语法尚未参与该过程。

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

于 2021-04-21T16:03:57.790 回答