在 C BNF 中,UnaryOperator ::= ( "&" | "*" | "+" | "-" | "~" | "!" )。为什么 / 和 % 在 UnaryOperator 中被排除?

In C BNF, UnaryOperator ::= ( "&" | "*" | "+" | "-" | "~" | "!" ). Why / and % are excluded in UnaryOperator?

在C BNF中,MultiplicativeExpressionUnaryOperator定义如下:

MultiplicativeExpression ::= CastExpression ( ( "*" | "/" | "%" ) MultiplicativeExpression )?
UnaryOperator ::= ( "&" | "*" | "+" | "-" | "~" | "!" )

/% 是否在 MultiplicativeExpression 中定义?

根据wikipedia

a unary operation is an operation with only one operand..

因此,只需要或只对一个操作数起作用的运算符是一元运算符。

%/ 肯定需要两个操作数,所以它们不是一元运算符。

如果您想知道 +- 的存在,它们是一元正负运算符(一元算术运算符) ,不是加减法。

引用 C11,章节 §6.5.3.3

The result of the unary + operator is the value of its (promoted) operand. The integer promotions are performed on the operand, and the result has the promoted type.

The result of the unary - operator is the negative of its (promoted) operand. The integer promotions are performed on the operand, and the result has the promoted type.

/% 永远不会存在于只接受一个操作数的上下文中,因此它们永远不会是 一元运算符 。 至于给出的其他运算符:

  1. & 可以表示地址(以及按位与)
  2. * 可以表示指针取消引用(以及乘法)。
  3. +-可以是一元加/减。
  4. !~是逻辑非和位补。

一些字符用于多个运算符。 * 用于乘法运算符(二元运算符)和地址间接运算符(一元运算符)。因此,您可以使用

这样的表达式
x = a * *p; // multiply a by what p points to

%/ 在一元表达式中没有相似的用法,这就是它们没有出现在一元运算符列表中的原因。

& 是另一个可用作一元运算符(寻址)或二元运算符(按位 and)的字符。