2015-10-13 113 views
4

我遇到了一个内核补丁,它在已经有func(&a->b)时添加了一行func(&(a->b))&a->b&(a->b)之间有什么区别?带括号和不带括号的运算符的地址

请解释。

+1

在这种情况下,使用括号可以更清楚地表达你的意思。 – teppic

+0

@TlerlerSebastian不,这两个表达式是等价的。 ' - >'的优先级高于'&'。 –

+0

@PCLuddite是啊我记得我发表我的评论后,随后删除它。 –

回答

0

No. ->foo(对于任何值foo)是后缀运算符,并且具有比&(前缀运算符)更高的优先级。

3

没有区别,这只是为了可读性。 ->具有比&参考运算符更高的优先级。请参阅here

为了进一步证明了这一点,看看这些线的dissasembly:

一些短代码

struct A { 
    int b; 
}; 

int main() { 
    struct A *a; 
    int *c; 

    c = &a->b; // Disassemble these lines. 
    c = &(a->b); 

    return 1; 
} 

两条线的dissasembly等同于以下内容:

movq -16(%rbp), %rax 
    movq %rax, -8(%rbp) 

试试here中的代码自己看看。

+2

你真的不需要证明,它在绝对清晰的黑白中优先规则:) – teppic

+1

@teppic我知道,我只是喜欢使用该工具! –

0

没有区别。 ->组件选择运算符的优先级高于一元运算符&,因此表达式&a->b被解析为&(a->b),结果是a指向的实例中的成员b的地址。