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

时间:2016-05-05 08:31:44

标签: c bnf unary-operator binary-operators

在C BNF中,MultiplicativeExpressionUnaryOperator的定义如下:

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

/中是否定义了%MultiplicativeExpression

3 个答案:

答案 0 :(得分:2)

根据wikipedia

  

一元操作是只有一个操作数的操作..

因此,仅需要或仅处理一个操作数的运算符是一元运算符。

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

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

引用C11,章节§6.5.3.3

  

一元+运算符的结果是其(提升的)操作数的值。整数   在操作数上执行促销,结果具有提升类型。

  

一元-运算符的结果是其(提升的)操作数的否定。整数   在操作数上执行促销,结果具有提升类型。

答案 1 :(得分:1)

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

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

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

&是另一个可以用作一元运算符(address-of)或二元运算符(按位and)的字符。

答案 2 :(得分:0)

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

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