2010-09-24 4 views
2

Simplement, estSur quoi fonctionnent les opérateurs * et & si l'argument est complexe?

&someObject->someAttribute.someMember; 

équivalent à

&(someObject->someAttribute.someMember); 

ou

(&someObject)->someAttribute.someMember; 

ou

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

Ou devriez-vous mettre vraiment parenthèse explicite là-bas ju st être en sécurité?

+2

voir ici: http://www.cppreference.com/wiki/operator_precedence –

Répondre

10

Il est équivalent à:

&((someObject->someAttribute).someMember) 

Le -> et . ont la même priorité et sont associatifs gauche. L'unaire & a une priorité inférieure.

Si vous avez des expressions très complexes, vous devez certainement utiliser des parenthèses pour regrouper les éléments et clarifier votre code. Ce n'est pas particulièrement complexe, cependant; il est assez courant de voir un code comme celui-ci en C et C++.

3

Voir Wikipedia

Faites défiler jusqu'à la section opérateurs. Les opérateurs dans une case supérieure du graphique sont considérés avant les opérateurs dans une case inférieure. Voir aussi les règles d'associativité. Ou faut-il vraiment mettre des parenthèses explicites par sécurité? Ceci est en quelque sorte un problème de préférence, mais en règle générale, si vous avez du mal à comprendre, alors quelqu'un d'autre le fera aussi. Mettez des parenthèses en cas de doute.

+0

-1 parce que vous ne répondez pas vraiment la question, et il est une question simple et directe. Cela aurait dû être un commentaire au lieu d'une expédition de pêche de réputation. Voir le commentaire de Martin York pour un exemple. –

+3

@John: Un peu dur pour un tel nouvel utilisateur. Enseigner à pêcher est également important, et même préférable dans certains cas. –

+0

@Roger: Vous avez probablement raison. @dgnorton: Désolé pour la dureté. J'ai défait mon d/v. –

0

Si vous voulez l'adresse du someMember alors & (someObject-> someAttribute.someMember) OU & someObject-> someAttribute.someMember.

Première someObject-> someAttribute et seconde à ses membres somMember et troisième & adresse

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); 
Questions connexes