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

Le
jerome.frgacic
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 p=
oints 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 e=
ffet, 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éc=
larateurs complets. Jusque là j'ai bon? Si oui, à quoi cela sert-il d'a=
voir un point de séquence après chacun de ces derniers, puisqu'il n'y a=
aucune expression?

Au sujet du second, je vois parfaitement son intérêt, 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è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 ex=
pression, si? Si non, pourquoi la qualifiée d'expression complète si =
à la base ce n'est pas une expression?

Merci d'avance pour vos réponses :)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Antoine Leca
Le #24459351
é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
Taurre
Le #24459991
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 ;)
Antoine Leca
Le #24460431
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
Publicité
Poster une réponse
Anonyme