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我知道,我只是喜欢使用那个工具!