На что работают операторы * и &, если аргумент сложный? - PullRequest
2 голосов
/ 24 сентября 2010

Просто

&someObject->someAttribute.someMember;

эквивалентно

&(someObject->someAttribute.someMember);

или

(&someObject)->someAttribute.someMember;

или

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

Или вам действительнопоставить явные скобки там, чтобы быть в безопасности?

Ответы [ 3 ]

10 голосов
/ 24 сентября 2010

Это эквивалентно:

&((someObject->someAttribute).someMember)

* -> и . имеют одинаковый приоритет и являются левоассоциативными.Унарный - & имеет более низкий приоритет.

Если у вас очень сложные выражения, тогда вам непременно следует использовать скобки, чтобы сгруппировать вещи и уточнить ваш код.Это не особенно сложно, хотя;такой код часто встречается в C и C ++.

3 голосов
/ 24 сентября 2010

См. Википедия

Прокрутите вниз до раздела операторов.Операторы в верхнем поле на диаграмме рассматриваются перед операторами в нижнем поле.Также см. Правила для ассоциативности.

Или вы действительно должны поставить явные скобки, чтобы быть в безопасности?

Это в некоторой степени проблема предпочтений, но, как правило,, если у вас возникли проблемы с выяснением этого, то кто-то другой тоже будет.Поставьте скобки, если сомневаетесь.

0 голосов
/ 24 сентября 2010

Если вам нужен адрес someMember, то & (someObject-> someAttribute.someMember) ИЛИ & someObject-> someAttribute.someMember.

Сначала someObject-> someAttribute, затем его член somMember, а третье - & адрес

struct xxx { int xx; }; struct temp { int x; struct xxx ptr; };

    struct temp t1 = {125,{127}};
    struct temp *t2 = &t1;
    printf("%d %d",t2->x,*&t2->ptr.xx);
...