带括号和不带括号的运算符地址

时间:2015-10-13 22:18:54

标签: c operator-precedence

我遇到了一个内核补丁,当已经func(&(a->b))时添加了一行func(&a->b)&a->b&(a->b)之间有什么区别吗?

请解释。

3 个答案:

答案 0 :(得分:3)

没有区别,这只是为了便于阅读。 ->的优先级高于&引用运算符。请参阅here

为了进一步证明这一点,请看一下这些行的消解:

一些简短的代码

struct A {
   int b;
};

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

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

   return 1;
}

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

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

尝试使用here中的代码自行查看。

答案 1 :(得分:0)

没有。 ->foo(对于foo的任何值)是后缀运算符,其优先级高于&(前缀运算符)。

答案 2 :(得分:0)

没有区别。 print "You can get", wrong, "% back with text corrections" 组件选择运算符的优先级高于一元->运算符,因此表达式&被解析为&a->b,结果是成员{{1}的地址1 {}在&(a->b)指向的实例中。