expressions complètes, délcarateurs complets et points de séquence
3 réponses
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?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
jerome.frgacic@yahoo.fr é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 !
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 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 ;)
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 ;)
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
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
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à.
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à.