OVH Cloud OVH Cloud

int x= x+1

66 réponses
Avatar
Fabien LE LEZ
Bonjour,

Il me semble que l'expression suivante est autorisée (même si elle a
un comportement indéfini) :

int x= x+1;

Y a-t-il une raison pour laquelle les auteurs de la norme n'ont pas
purement et simplement interdit cette écriture ? Accessoirement, y
a-t-il des cas (pas trop tordus) où elle peut être utile ?

Merci d'avance...

10 réponses

1 2 3 4 5
Avatar
Richard Delorme
Bonjour,

Il me semble que l'expression suivante est autorisée (même si elle a
un comportement indéfini) :

int x= x+1;

Y a-t-il une raison pour laquelle les auteurs de la norme n'ont pas
purement et simplement interdit cette écriture ?


Je comprends le comportement indéfini comme quelque chose dont
l'écriture par le codeur est interdite mais que le compilateur n'a pas
obligation de détecter. La raison est sans doute de ne pas trop
compliquer l'écriture des compilateurs.

Accessoirement, y
a-t-il des cas (pas trop tordus) où elle peut être utile ?


Tester un compilateur face à ce comportement indéfini ? Par exemple, si
le compilateur émet un avertissement sur cette expression (ce que fait
g++ par exemple), il n'est peut-être pas trop mauvais.

--
Richard

Avatar
Marc Boyer
Fabien LE LEZ a écrit :
Il me semble que l'expression suivante est autorisée (même si elle a
un comportement indéfini) :

int x= x+1;

Y a-t-il une raison pour laquelle les auteurs de la norme n'ont pas
purement et simplement interdit cette écriture ?


Peut être parce que le cas général est trop compliqué
(voir indécidable):
si on remplace l'expression par
int x= f();
avec x une variable externe, et f qui fait appel à x.

Accessoirement, y
a-t-il des cas (pas trop tordus) où elle peut être utile ?


Une étrangetée du genre:
extern int x;
int x=f();

int f(){
static first= true;
if (first) {
first= false;
return 0;
} else {
x++;
return x;
}
}

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
Matthieu Moy
Marc Boyer writes:

Fabien LE LEZ a écrit :
Il me semble que l'expression suivante est autorisée (même si elle a
un comportement indéfini) :

int x= x+1;

Y a-t-il une raison pour laquelle les auteurs de la norme n'ont pas
purement et simplement interdit cette écriture ?


Peut être parce que le cas général est trop compliqué
(voir indécidable):


Oui, enfin, il y a pas mal de langages (y compris si mes souvenirs
sont bons celui pour lequel j'ai écrit un compilateur en un mois en
deuxième année d'école d'ingé, donc, un pas trop compliqué) ou la
déclaration prends effet au « ; » suivant. C'est une règle hyper
simple, et très efficace.

--
Matthieu


Avatar
Stan
"Matthieu Moy" a écrit dans le message
de news:
Marc Boyer writes:


Oui, enfin, il y a pas mal de langages (y compris si mes souvenirs
sont bons celui pour lequel j'ai écrit un compilateur en un mois en
deuxième année d'école d'ingé, donc, un pas trop compliqué) ou la
déclaration prends effet au « ; » suivant. C'est une règle hyper
simple, et très efficace.



Oui, et alors, dans le cas mentionné, ça se traduit comment ?

--
-Stan

Avatar
Matthieu Moy
"Stan" writes:

Oui, et alors, dans le cas mentionné, ça se traduit comment ?


Pour « int x = x + 1; », le « x » n'est pas encore déclaré quand tu
parses « x + 1 », donc, tu as la même erreur que dans

int main () {
int y = x + 1;
}

pour la variable x.

--
Matthieu

Avatar
Marc Boyer
Matthieu Moy a écrit :
"Stan" writes:

Oui, et alors, dans le cas mentionné, ça se traduit comment ?


Pour « int x = x + 1; », le « x » n'est pas encore déclaré quand tu
parses « x + 1 », donc, tu as la même erreur que dans

int main () {
int y = x + 1;
}

pour la variable x.


Tu n'as pas compris ma remarque: en effet, pour l'expression
int x= x+1;
il n'est pas difficile d'émettre un diagnostic. Mais est-ce
une erreur si fréquente ?

Mais quand je parle de cas général, c'est le cas
int x=f();
avec f dépendant de x.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?


Avatar
Matthieu Moy
Marc Boyer writes:

Tu n'as pas compris ma remarque: en effet, pour l'expression
int x= x+1;


Si, j'ai bien compris ta remarque. Mais le fait qu'il existe un cas
vraiment tordu justifie-t-il qu'on autorise à écrire des conneries
alors qu'il y a une règle simple à comprendre et à implementer qui
évite les bétises les plus grosses, et les plus courrantes (j'ai
infiniment plus de variables locales que de variables globales dans
mes programmes) ?

--
Matthieu

Avatar
Fabien LE LEZ
On Mon, 03 Oct 2005 12:39:45 +0200, Matthieu Moy
:

Mais le fait qu'il existe un cas
vraiment tordu justifie-t-il qu'on autorise à écrire des conneries


Dans l'ensemble, le C++ est très permissif.

Si x et f() sont définis dans des modules différents, il est
effectivement impossible d'avoir une erreur de compilation.

Donc, après lecture du présent thread, je comprends que ce soit
seulement un warning (sur les bons compilos) et pas une erreur définie
par le standard.

Avatar
Marc Boyer
Matthieu Moy a écrit :
Marc Boyer writes:
Tu n'as pas compris ma remarque: en effet, pour l'expression
int x= x+1;


Si, j'ai bien compris ta remarque. Mais le fait qu'il existe un cas
vraiment tordu justifie-t-il qu'on autorise à écrire des conneries
alors qu'il y a une règle simple à comprendre et à implementer qui
évite les bétises les plus grosses, et les plus courrantes (j'ai
infiniment plus de variables locales que de variables globales dans
mes programmes) ?


Ben, propose un ammendement à la norme si tu trouves ça
simple à exprimer, à comprendre et à implémenter.

Mais bon, je te refais l'exemple en variable locale:
int x=f(x);
est-ce une contruction à prohiber ? Je n'en sais rien.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?


Avatar
Matthieu Moy
Marc Boyer writes:

Ben, propose un ammendement à la norme si tu trouves ça
simple à exprimer, à comprendre et à implémenter.


Encore une fois, c'est comme ça que c'est fait dans de nombreux
langages. Ma proposition n'a rien d'un scoop, hein...

Mais bon, je te refais l'exemple en variable locale:
int x=f(x);
est-ce une contruction à prohiber ? Je n'en sais rien.


Si tu considère que la déclaration n'est effective qu'à la fin de
l'instruction, le f(x) est refusé, car x n'est pas encore déclaré à ce
moment là. Je ne vois d'ailleurs pas en quoi la fonction « f » est si
différente que la fonction « + », hormis la syntaxe.

--
Matthieu

1 2 3 4 5