为什么运算符不能放在括号中?

时间:2018-07-10 08:53:48

标签: c++ c

当我尝试制作这样的宏时,问题就来了:

#define OP1(a,b,op) (a) op (b)

然后我想知道为什么不将op放在括号中,因为它也是一个宏参数。

然后我发现我什至不能拥有它:

1 (+) 1;

否则将出现错误:

error: expected primary-expression before ')' token

谁能告诉我说运算符不能放在括号中的规则在哪里?我真的找不到它。谢谢。

3 个答案:

答案 0 :(得分:8)

§7.6.6 (expr.add)将“附加表达式”定义为:

additive-expression:
    multiplicative-expression
    additive-expression + multiplicative-expression
    additive-expression - multiplicative-expression

不允许在运算符周围加括号。

答案 1 :(得分:1)

实际上,没有任何规则表明运算符不应放在括号中。但是有一条规则规定,“对于像+这样的二进制运算符,该运算符两侧的值都必须是有效的操作数,例如5、5.2”。

因此,表达式(+)到编译器意味着您将两个括号(左括号,加号,右括号)加在一起,而该括号是该语言不支持的。

当然,将宏参数放在括号中是一种很好的做法,但是实际上没有必要在这种情况下将运算符放在括号中,因为无法传递复杂的运算符表达式,因此您可以放心,您的宏将始终工作。

答案 2 :(得分:1)

在编程中(如在数学中一样),括号用于覆盖运算符的优先级。

在不带括号的情况下,2 + 3 * 4被评估为2 + (3 * 4),因为乘法(*)的优先级高于加法(+)。可以使用括号将23的加法运算发生在4与(结果的乘积)之前,方法是将它们放在加法运算符及其操作数周围,{{1} }。

以上表达式中的(2 + 3) * 43 * 4都是有效表达式。

表达式2 + 3中的

+不是有效的表达式。此外,假设括号中包含有效的子表达式,则整个表达式都是无效的,因为它只是一个值列表,没有运算符将它们连接到表达式中。

更重要的是,这也不是您在学校学习的编写数学表达式的方式。


回到1 (+) 2,为避免隐藏的错误和头痛(由于运算符的优先级),应始终将此类宏的扩展值括在括号中,如下所示:

#define