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
Jean-Marc Bourguet
JBB writes:

Fabien LE LEZ wrote:
Bonjour,
Il me semble que l'expression suivante est autorisée (même si elle a
un comportement indéfini) :
int x= x+1;

Pour moi ça devrait donner le même résultat que:

int x;
x = x + 1;

Par contre je ne vois pas trop l'intérêt de faire ça.

A la limite: int x = x * 2;
pourrait garantir que x est pair.


Rien ne garanti que la valeur "non initialisee" ne trappe pas.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| 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...

Si, elle témoigne d'une ignorance du problème doublée d'un refus
irraisooné d'écouter ceux qui essaient de te l'expliquer, triplé d'un
naiveté désarmante.

-- Gaby
Avatar
Gabriel Dos Reis
Matthieu Moy writes:

[...]

| Je peux aussi écrire « int x = x + (- x); ».

Oui. Et ?

-- Gaby
Avatar
Matthieu Moy
Jean-Marc Bourguet writes:

Rien ne garanti que la valeur "non initialisee" ne trappe pas.


Qu'appelles-tu « trapper » ? lever une erreur quand on y accède ?

--
Matthieu

Avatar
Marc Boyer
Le 03-10-2005, Matthieu Moy a écrit :
Marc Boyer writes:
Après, dans le cas général, peut-il etre utile d'utiliser une
construction de la forme
int x= f(x);
ma réponse est 'je ne sais pas'.


Vu le nombre d'utilisations potentielles (je ne me souviens pas avoir
jamais eu besoin de ça, même si ma carrière de programmeur n'est
encore pas très longue), et la difficulté de contourner (ecrire « int
x; x = f(x); »), si c'était moi qui devais choisir, je n'hésiterais
pas longtemps.


Je crois que c'est Jean-Marc qui nous mets sur la piste
de la solution: il s'agit peut-etre d'un constructeur
(ce qui interdit la construction en deux temps), et
il peut avoir besoin de l'adresse de la variable
(pour modifier this).
Bon, je n'ai jamais encore joué à modifier this,
donc, je ne vais pas avoir beaucoup plus d'info à donner
sur le pourquoi on l'utilise.

Tu peux très bien considérer que tu traites d'abord les déclarations
de type et ensuite les initialisations, et que ton code est équivalent
à

int x;
int y;
x = f(y);

Ça serait sans doute très bête, mais pas beaucoup plus que « int x > x + 1; ».


Mais je pense que ce serait un changement bien plus important
dans le langage.

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
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Matthieu Moy writes:
|
| > Marc Boyer writes:
| >
| > > Matthieu Moy a écrit :
| > >> 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...
| > >
| > > Oui, mais est-ce une restriction utile ?
| >
| > Je te retourne la question : est-ce utile d'autoriser cette
| > construction ?
|
| Je parie qu'on peut trouver une utilisation legitime, du moins si on
| prend l'adresse de la variable plutot que sa valeur (qui non
| initialisee pourrait trapper).

Ceci est classique

void* p = &p;

ansi que

circular_buffer buffer = buffer;

-- Gaby
Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| Jean-Marc Bourguet writes:
|
| > Rien ne garanti que la valeur "non initialisee" ne trappe pas.
|
| Qu'appelles-tu « trapper » ? lever une erreur quand on y accède ?

Par exemple.

-- Gaby
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 03-10-2005, Matthieu Moy a écrit :
| > Marc Boyer writes:
| >> Après, dans le cas général, peut-il etre utile d'utiliser une
| >> construction de la forme
| >> int x= f(x);
| >> ma réponse est 'je ne sais pas'.
| >
| > Vu le nombre d'utilisations potentielles (je ne me souviens pas avoir
| > jamais eu besoin de ça, même si ma carrière de programmeur n'est
| > encore pas très longue), et la difficulté de contourner (ecrire « int
| > x; x = f(x); »), si c'était moi qui devais choisir, je n'hésiterais
| > pas longtemps.
|
| Je crois que c'est Jean-Marc qui nous mets sur la piste
| de la solution: il s'agit peut-etre d'un constructeur
| (ce qui interdit la construction en deux temps), et
| il peut avoir besoin de l'adresse de la variable
| (pour modifier this).

On ne peut pas modifier la valeur de this. Mais regarde l'exemple que
j'ai posté.

-- Gaby
Avatar
Matthieu Moy
Marc Boyer writes:

Je crois que c'est Jean-Marc qui nous mets sur la piste
de la solution: il s'agit peut-etre d'un constructeur
(ce qui interdit la construction en deux temps), et
il peut avoir besoin de l'adresse de la variable
(pour modifier this).


Ca peut être une utilisation trouvée a postériori, mais la décision
d'accepter cette construction date de bien avant la notion de
constructeur.

--
Matthieu

Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| Marc Boyer writes:
|
| > Je crois que c'est Jean-Marc qui nous mets sur la piste
| > de la solution: il s'agit peut-etre d'un constructeur
| > (ce qui interdit la construction en deux temps), et
| > il peut avoir besoin de l'adresse de la variable
| > (pour modifier this).
|
| Ca peut être une utilisation trouvée a postériori,

Pourquoi ?

| mais la décision
| d'accepter cette construction date de bien avant la notion de
| constructeur.

Oui, void* p = &p;

-- Gaby
1 2 3 4 5