Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Respect de la priorite des operateurs

3 réponses
Avatar
candide
Bonjour,

Soit le programme suivant :


---------- 8< -----------------

int main(void)
{
struct {int tab[5];} toto;

toto.tab[2]=33;

return 0;
}

---------- >8 -----------------


Comment se fait-il que l'affectation

toto.t[2]=33;

soit interprétée "comme il se doit" par le compilateur (gcc), à savoir :

(toto.t)[2]=33;


alors que l'opérateur d'indexation [] a une priorité supérieure à
l'opérateur de sélection directe . en sorte que l'affectation initiale
devrait être comprise comme l'instruction (erronée) suivante :

toto.(t[2])=33;

?

Merci



P.S. Où la norme discute-t-elle de la précédence des opérateurs ? Il y a
un tableau des priorités quelque part ?

3 réponses

Avatar
Damien Goutte-Gattat
Bonjour,

candide wrote:
P.S. Où la norme discute-t-elle de la précédence des opérateurs ? Il y a
un tableau des priorités quelque part ?


À priori, dans la section 6.5, "Expressions", dans une note de bas de
page :

"
The syntax specifies the precedence of operators in the evaluation of an
expression, which is the same as the order of the major subclauses of
this subclause, highest precedence first. Within each major subclause,
the operators have the same precedence.
"

Donc d'une certaine manière, c'est la table des matières qui fait office
de "tableau des priorités", les opérateurs décrits en 6.5.n ayant la même
priorité, supérieure à celle des opérateurs décrits en 6.5.n+1.

Du coup, pour la question principale :
Comment se fait-il que l'affectation

toto.t[2]3;

soit interprétée "comme il se doit" par le compilateur (gcc), à savoir :

(toto.t)[2]3;

alors que l'opérateur d'indexation [] a une priorité supérieure à
l'opérateur de sélection directe . en sorte que l'affectation initiale
devrait être comprise comme l'instruction (erronée) suivante :

toto.(t[2])3;


Les opérateurs d'indexation [] et de sélection . sont tous les deux
décrits dans la même sous-section (6.5.2, "Postfix operators"), en
application de la note ci-dessus ils doivent donc avoir la même priorité.

En conséquence, c'est l'associativité à gauche de ces opérateurs qui
intervient ici et qui conduit à interpréter "toto.t" comme premier
opérande de [], et non "t[2]" comme second opérande de .

Sous réserve d'erreur grossière de ma part bien sûr.

Damien

Avatar
candide

À priori, dans la section 6.5, "Expressions", dans une note de bas de
page :


Ah ok j'avais vraiment pas pensé à regarder une info aussi importante
dans une footnote !!!! (1)
Et la toc qui fait office de tableau, pas mal dans le genre !

Les opérateurs d'indexation [] et de sélection . sont tous les deux
décrits dans la même sous-section (6.5.2, "Postfix operators"), en
application de la note ci-dessus ils doivent donc avoir la même priorité.


Ah oui, bien sûr. Je m'étais fié au tableau dans le Harbison & Steele et
[] et . y sont sur des lignes différentes et j'avais pas fait gaffe
qu'ils ont le même numéro de précédence. Faut dire que Harbison&Steele
et ergonomie ça fait deux. Je suis pas toujours très attentif non plus !

OK, je te remercie de ces précieuses indications.


_______
(1) On m'a prendre conscience récemment que les info sur la promotion
intégrale sont en fait largement limitées par une footnote (§6.2 de
C90)? Bah, ne nous plaignons pas, on n'a pas des footnotes dans les
footnotes !

Avatar
Vincent Lefevre
Dans l'article <48125702$0$5047$,
candide écrit:


À priori, dans la section 6.5, "Expressions", dans une note de bas de
page :


Ah ok j'avais vraiment pas pensé à regarder une info aussi importante
dans une footnote !!!! (1)


Les footnotes ne sont pas normatives. Cette information doit donc se
trouver ailleurs: c'est la syntaxe qui indique la précédence.

Et la toc qui fait office de tableau, pas mal dans le genre !


Pourquoi pas? Ce n'est de toute façon pas normatif (encore une fois).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)