当我尝试制作这样的宏时,问题就来了:
#define OP1(a,b,op) (a) op (b)
然后我想知道为什么不将op放在括号中,因为它也是一个宏参数。
然后我发现我什至不能拥有它:
1 (+) 1;
否则将出现错误:
error: expected primary-expression before ')' token
谁能告诉我说运算符不能放在括号中的规则在哪里?我真的找不到它。谢谢。
答案 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)
,因为乘法(*
)的优先级高于加法(+
)。可以使用括号将2
和3
的加法运算发生在4
与(结果的乘积)之前,方法是将它们放在加法运算符及其操作数周围,{{1} }。
以上表达式中的(2 + 3) * 4
和3 * 4
都是有效表达式。
2 + 3
中的 +
不是有效的表达式。此外,假设括号中包含有效的子表达式,则整个表达式都是无效的,因为它只是一个值列表,没有运算符将它们连接到表达式中。
更重要的是,这也不是您在学校学习的编写数学表达式的方式。
回到1 (+) 2
,为避免隐藏的错误和头痛(由于运算符的优先级),应始终将此类宏的扩展值括在括号中,如下所示:
#define