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

C 带括号和不带括号的运算符地址,c,operator-precedence,C,Operator Precedence,我遇到了一个内核补丁,它在已经有func(&a->b)的时候添加了一行func(&a->b)。&a->b和和(a->b)之间有什么区别吗 请解释。否。->foo(对于foo的任何值)是后缀运算符,优先级高于和(前缀运算符)。没有区别,这只是为了可读性。->的优先级高于&参考运算符。看 为了进一步证明这一点,请看一下这些行的分解: 一些短代码 struct A { int b; }; int main() { struct A *a; int *c; c = &

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


请解释。

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

没有区别,这只是为了可读性。
->
的优先级高于
&
参考运算符。看

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

一些短代码

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)

请尝试输入代码,以便自己查看

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

在本例中,使用括号只是为了更清楚地表达您的意思。@Tylersbastian不,这两个表达式是等价的
->
的优先级高于
&
@PCLuddite是的,我刚发布我的评论并随后将其删除,我就记得。
->
绑定比
&
更紧密。因此不需要括号,尽管宏应该使用过多的括号。不需要,因为
->
运算符的优先级高于
&
。您不需要证明,优先级规则中的黑白两色是绝对清楚的:)@teppic我知道,我只是喜欢使用那个工具!