Priorité entre l’access des membres à partir d’un pointeur et la dissortingbution

Si j’ai

typedef struct{ int i; } typeB; typeA *p; 

then: Quelle est la priorité entre l’access membre à partir d’un pointeur et le transtypage?

  (typeB *)p->i 

Est-ce réellement ((typeB *)p)->i ou (typeB *)(p->i) ?

Un tableau de priorité d’opérateur indiquerait qu’un -> se lie plus étroitement que la dissortingbution.

 typedef void *typeA; typeB b; typeA a = &b; (typeB *)a->i; /* wrong: attempt to dereference a void pointer */ ((typeB *)a)->i; /* ok */ 

Un tableau complet des priorités des opérateurs pour votre future référence est fourni ci-dessous. Dans le tableau, les opérateurs situés en haut de la liste sont plus étroitement liés que ceux situés en bas de la liste (les opérateurs d’expression principaux sont donc les plus étroitement liés). Si des opérateurs de même priorité sont utilisés dans la même expression de manière ambiguë (c’est-à-dire qu’ils ne sont pas capturés dans un opérateur d’expression primaire comme () ou [] ), le problème est résolu en suivant la direction d’associativité. Donc, par exemple l’expression:

 7 + (3 - 5 * 2 + 15) - 6 

est évalué dans cet ordre (selon le tableau):

 7 + (3 - 10 + 15) - 6 // evaluate * in () 7 + (-7 + 15) - 6 // evaluate - in () (it is left of the +) 7 + 8 - 6 // evaluate + in () 15 - 6 // evaluate + (it is left of the -) 9 // evaluate - 

Bien entendu, le compilateur est libre d’effectuer le calcul différemment, mais son résultat doit correspondre au résultat obtenu en suivant les règles de priorité.

 Operator Type Operator(s) Associativity ============= =========== ============= Primary () [] . -> expr++ expr-- left-to-right Expression Operators ------------- ----------- ------------- Unary * & + - ! ~ ++expr --expr (typecast) sizeof right-to-left Operators ------------- ----------- ------------- Binary * / % left-to-right Operators + - >> << < > <= >= == != & ^ | && || ------------- ----------- ------------- Ternary ?: right-to-left Operator ------------- ----------- ------------- Assignment = += -= *= /= %= >>= <<= &= ^= |= right-to-left Operators ------------- ----------- ------------- Comma , left-to-right ============= =========== ============= 

en C, -> la priorité de l’operatior est supérieure à la dissortingbution, qui est (nom du type)

alors (type B *) p-> i est (typeB *) (p-> i)