在 C BNF 中,MultiplicativeExpression
定义UnaryOperator
如下:
MultiplicativeExpression ::= CastExpression ( ( "*" | "/" | "%" ) MultiplicativeExpression )? UnaryOperator ::= ( "&" | "*" | "+" | "-" | "~" | "!" )
/
和%
定义MultiplicativeExpression
在?
在 C BNF 中,MultiplicativeExpression
定义UnaryOperator
如下:
MultiplicativeExpression ::= CastExpression ( ( "*" | "/" | "%" ) MultiplicativeExpression )? UnaryOperator ::= ( "&" | "*" | "+" | "-" | "~" | "!" )
/
和%
定义MultiplicativeExpression
在?
根据维基百科
一元运算是只有一个操作数的运算。
因此,只需要或只处理一个操作数的运算符是一元运算符。
%
并且/
肯定需要两个操作数,所以它们不是一元运算符。
如果您想知道 and 的存在+
,-
它们是一元正负运算符(一元算术运算符),而不是加法和减法。
引用C11
,第 6.5.3.3 章
一元运算符的结果
+
是其(提升的)操作数的值。整数提升在操作数上执行,结果具有提升的类型。
和
一元运算符的结果
-
是其(提升的)操作数的负数。整数提升在操作数上执行,结果具有提升的类型。
一些字符用于多个运算符。*
用于乘法运算符(二元运算符)和地址间接运算符(一元运算符)。因此,你可以有一个像
x = a * *p; // multiply a by what p points to
%
并且/
在一元表达式中没有类似的用途,这就是为什么它们不出现在一元运算符列表中的原因。
&
是另一个可用作一元运算符(address-of)或二元运算符(按位and
)的字符。
/
并且%
永远不会存在于只接受一个操作数的上下文中,因此它们永远不是一元运算符。至于给出的其他运算符:
&
可以表示地址(以及按位与)*
可以表示指针取消引用(以及乘法)。+
并且-
可以是一元加/减。!
和~
是逻辑否定和按位补码。