箭头操作员附近的额外括号

时间:2013-06-30 00:17:21

标签: c pointers parentheses

我正在尝试解码的程序包括以下行:

#define nn(sp)   ((sp)->nn)

从上下文(未显示)中,我很确定'sp'是一个指向结构的指针,该结构包含'nn'作为其变量之一。

在表达式“((sp) - > nn)”中,内部括号是否可用于任何可能的目的?如果没有,那么外部括号也可能没有用处吗?

2 个答案:

答案 0 :(得分:5)

#define nn(sp)   ((sp)->nn)

内括号是必需的。如果您将p + 10*p指针传递给nn宏,那么在没有内括号的情况下会遇到一些麻烦,因为->的优先级高于+且一元*

此处不需要外括号,因为表达式涉及后缀操作,并且没有运算符优先于后缀运算符。

答案 1 :(得分:4)

这是一种通用的防御策略,可以将宏观参数和整个替换文本包装在parens中。这可以保护宏免受意外的优先级更改。

考虑sp参数是否是一个解除引用的指针。

nn(*x)  //--> ((*x)->nn)

但没有内在的内容:

nn(*x)  //--> (*x->nn)