2

简单来说就是

&someObject->someAttribute.someMember;

相当于

&(someObject->someAttribute.someMember);

或者

(&someObject)->someAttribute.someMember;

或者

(&(someObject->someAttribute)).someMember;

或者你真的应该把明确的括号放在那里只是为了安全吗?

4

3 回答 3

10

它相当于:

&((someObject->someAttribute).someMember)

->和具有相同的.优先级并且是左结合的。一元-&具有较低的优先级。

如果您有非常复杂的表达式,那么您当然应该使用括号来对事物进行分组并阐明您的代码。不过,这并不是特别复杂。在 C 和 C++ 中看到这样的代码是很常见的。

于 2010-09-24T14:40:54.850 回答
3

维基百科

向下滚动到操作员部分。图表中较高方框中的运算符优先于较低方框中的运算符。另请参阅关联性规则。

或者你真的应该把明确的括号放在那里只是为了安全吗?

这在某种程度上是一个偏好问题,但作为一般规则,如果您在弄清楚它时遇到任何困难,那么其他人也会这样做。有疑问时加括号。

于 2010-09-24T14:48:38.190 回答
0

如果你想要 someMember 的地址,那么 &(someObject->someAttribute.someMember) 或 &someObject->someAttribute.someMember。

首先是 someObject->someAttribute,其次是它的成员 somMember,第三是 & 地址

结构 xxx { int xx; }; 结构温度 { int x; 结构 xxx ptr; };

    struct temp t1 = {125,{127}};
    struct temp *t2 = &t1;
    printf("%d %d",t2->x,*&t2->ptr.xx);
于 2010-09-24T15:09:17.287 回答