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

expressions complètes, délcarateurs complets et points de séquence

3 réponses
Avatar
jerome.frgacic
Bonjour =E0 tous,

Je me penche depuis quelques temps sur la notion de point de s=E9quence et =
il y a deux d=E9tails que je ne saisis pas bien =E0 leur sujet. Parmi les p=
oints de s=E9quence, la norme sp=E9cifie notamment ces deux ci:

> The end of a full declarator: declarators (6.7.6);

> Between the evaluation of a full expression
> and the next full expression to be evaluated.=20
> The following are full expressions: an initializer
> that is not part of a compound literal (6.7.9);

Concernant le premier, j'ai un peu de mal =E0 voir sa raison d'=EAtre. En e=
ffet, si j'ai bien saisi, dans les d=E9finitions suivantes:

int x =3D 10;
int y;

les d=E9clarateurs sont respectivement "int x" et "int y" et sont des d=E9c=
larateurs complets. Jusque l=E0 j'ai bon? Si oui, =E0 quoi cela sert-il d'a=
voir un point de s=E9quence apr=E8s chacun de ces derniers, puisqu'il n'y a=
aucune expression?

Au sujet du second, je vois parfaitement son int=E9r=EAt, mais j'ai un peti=
t soucis du point de vue syntaxique. En fait, j'ai un peu de mal avec la qu=
alification d'un initialiseur comme expression compl=E8te:

int tab[2] =3D { 10, 20 };

Si je ne dit pas de b=EAtise, la liste d'initialisation de la variable "tab=
" comprend deux expressions : 10 et 20. Mais, "{ 10, 20 }" n'est pas une ex=
pression, si? Si non, pourquoi la qualifi=E9e d'expression compl=E8te si =
=E0 la base ce n'est pas une expression?

Merci d'avance pour vos r=E9ponses :)

3 réponses

Avatar
Antoine Leca
écrivit :
Bonjour à tous,

Je me penche depuis quelques temps sur la notion de point de
séquence et il y a deux détails que je ne saisis pas bien à leur
sujet. Parmi les points de séquence, la norme spécifie notamment
ces deux ci:

The end of a full declarator: declarators (6.7.6);



Between the evaluation of a full expression
and the next full expression to be evaluated.
The following are full expressions: an initializer
that is not part of a compound literal (6.7.9);



Concernant le premier, j'ai un peu de mal à voir sa raison d'être.
En effet, si j'ai bien saisi, dans les définitions suivantes:

int x = 10;
int y;

les déclarateurs sont respectivement "int x" et "int y" et sont
des déclarateurs complets. Jusque là j'ai bon?



Je pense.

Si oui, à quoi cela sert-il d'avoir un point de séquence après
chacun de ces derniers, puisqu'il n'y a aucune expression?



int tableau_variable[n = taille_du_tableau(*p++)]

est aussi un déclarant complet (que perso je déconseillerai).


Au sujet du second, je vois parfaitement son intérêt, mais j'ai
un petit soucis du point de vue syntaxique. En fait, j'ai un peu
de mal avec la qualification d'un initialiseur comme expression
complète:

int tab[2] = { 10, 20 };

Si je ne dit pas de bêtise, la liste d'initialisation de la
variable "tab" comprend deux expressions : 10 et 20. Mais,
"{ 10, 20 }" n'est pas une expression, si? Si non, pourquoi
la qualifiée d'expression complète si à la base ce n'est pas
une expression?



Parce que c'est une norme, donc un texte de droit, et que pour les mots
ou expressions qui sont définis par le texte (indiqué par l'utilisation
d'italiques) doivent être utilisé strictement dans le sens défini par le
texte, lequel prime sur le sens habituel des mots employés voire même
comme ici sur le sens des composants de l'expression.

Une bonne norme est une norme qui se lit bien, donc où les éventuelles
différences de sens sont réduites au minimum ; en ce qui concerne ce
domaine des points de séquence, le sujet a été tellement débattu et a
tellement évolué que les rédacteurs n'ont malheureusement plus la
possibilité d'utiliser des formulations simples avec des concepts
univoques : ce qui nous vaut des expressions complètes qui ne sont pas
des expressions, mais aussi dans la même phrase un « initialisant sauf
dans un littéral composé », quand bien même les initialisants ne sont
utilisés que dans les littéraux composés et dans les initialisations !


Antoine
Avatar
Taurre
Le lundi 7 mai 2012 10:26:31 UTC+2, Antoine Leca a écrit :

int tableau_variable[n = taille_du_tableau(*p++)]

est aussi un déclarant complet (que perso je déconseillerai).



Aaaah ! Je n'avais effectivement pas pensé à ce cas qui est possible de puis l'introduction des tableaux de longueur variable. Bien vu! :)


Parce que c'est une norme, donc un texte de droit, et que pour les mots
ou expressions qui sont définis par le texte (indiqué par l'utilisati on
d'italiques) doivent être utilisé strictement dans le sens défini p ar le
texte, lequel prime sur le sens habituel des mots employés voire même
comme ici sur le sens des composants de l'expression.

Une bonne norme est une norme qui se lit bien, donc où les éventuelle s
différences de sens sont réduites au minimum ; en ce qui concerne ce
domaine des points de séquence, le sujet a été tellement débattu et a
tellement évolué que les rédacteurs n'ont malheureusement plus la
possibilité d'utiliser des formulations simples avec des concepts
univoques : ce qui nous vaut des expressions complètes qui ne sont pas
des expressions, mais aussi dans la même phrase un « initialisant sau f
dans un littéral composé », quand bien même les initialisants ne sont
utilisés que dans les littéraux composés et dans les initialisation s !



Il me semble quand même que cela n'aurait pas mangé de pain d'exclure l es initialisants de la notion d'expression complète et de les mettre dans une catégorie à part... M'enfin, ce n'est donc pas moi qui ait mal com pris la notion d'expression, c'est bien la norme qui inclut les initialisan ts dans la notion d'expression complète alors que ce ne sont à la base pas des expressions.

Voilà qui est désormais nettement plus clair dans mon esprit, merci bea ucoup pour cette réponse ;)
Avatar
Antoine Leca
Taurre écrit :
Le lundi 7 mai 2012 10:26:31 UTC+2, Antoine Leca a écrit :

int tableau_variable[n = taille_du_tableau(*p++)]



Aaaah ! [...] Bien vu! :)



Je n'ai aucun mérite : j'ai juste suivi l'évolution de la norme, et ai
remarqué que cette clause-ci fut ajoutée au moment de l'introduction de
cette fonctionnalité-là.


Antoine