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

Avatar
Marc Boyer
Matthieu Moy a écrit :
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.


Tout à fait.
Mais que le C (et le C++ à sa suite) soit plein de mochettées
historiques, nous en sommes bien d'accord.

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

Nombreux langages ? Quels rapports ont-ils avec C++ ?


Le rapport, c'est que j'ai eu l'impression de passer pour un
extra-terrestre quand j'ai proposé une solution simple pour interdire
la construction casse gueule. Si je suis un extra-terrestre pour avoir
proposé ça, il y a beaucoup d'autres extra-terrestres.

Le C++ doit-il selon toi être défini sans jamais s'inspirer de ce qui
se fait dans d'autres langages ?

--
Matthieu

Avatar
Matthieu Moy
Gabriel Dos Reis writes:

Et c'est un compilateur pour un langage largement utilisé dans la
programmation système, je suppose.


D'ou vient cette supposition ?

--
Matthieu

Avatar
Marc Boyer
Gabriel Dos Reis a écrit :
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.


OK. J'ai cru que c'était ce que sous-entendait le post de
Jean-Marc. Je m'a trompé.

Mais regarde l'exemple que j'ai posté.


J'ai vu :-)


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

struct circular_buffer {
circular_buffer* next;
circular_buffer(circular_buffer& c) : next(&c) { }
// ...
};

circular_buffer buffer = buffer;


Mais alors, comment font les programmeurs Pascal, Java, Ada, pour
faire des listes circulaires ?

--
Matthieu

Avatar
Marc Boyer
Le 03-10-2005, Matthieu Moy a écrit :
Gabriel Dos Reis writes:

struct circular_buffer {
circular_buffer* next;
circular_buffer(circular_buffer& c) : next(&c) { }
// ...
};

circular_buffer buffer = buffer;


. Mais alors, comment font les programmeurs Pascal


Pas de constructeur en Pascal, donc, la démarche
en deux étapes est possible.

Java


L'absence d'appel du destructeur systématique me fait
supposer que l'idiome RAII est utilisé avec moins
de systématisme en Java, donc, cf Pascal.

Ada, pour faire des listes circulaires ?


Je me suis arrêté à Ada83...

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


Avatar
Jean-Marc Bourguet
Matthieu Moy writes:

Gabriel Dos Reis writes:

struct circular_buffer {
circular_buffer* next;
circular_buffer(circular_buffer& c) : next(&c) { }
// ...
};

circular_buffer buffer = buffer;


Mais alors, comment font les programmeurs Pascal, Java, Ada, pour
faire des listes circulaires ?


Je connais pas Java.

Si j'ai bonne memoire (ce qui n'est pas certain, sans compter qu'il y
a des variantes de Pascal), en Pascal il n'est pas possible
d'initialiser dans les declarations. Le probleme ne se pose donc pas.

En Ada, il y a a coup sur moyen avec des types controlles d'avoir
l'equivalent; et j'ai le vague souvenir qu'il y avait moyen aussi avec
l'initialisation par defaut.

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:

| Gabriel Dos Reis writes:
|
| > Nombreux langages ? Quels rapports ont-ils avec C++ ?
|
| Le rapport, c'est que j'ai eu l'impression de passer pour un
| extra-terrestre quand j'ai proposé une solution simple pour interdire
| la construction casse gueule. Si je suis un extra-terrestre pour avoir
| proposé ça, il y a beaucoup d'autres extra-terrestres.

Je dirais pas « extra-terrestre », juste quelqu'un qui n'a pas l'air
de comprendre l'étendu de la choses et les différentes
intéractions. Marc a montré un exemple que je trouve tout à fait à
point -- ne pas oublier la compilation séparée par exemple.

| Le C++ doit-il selon toi être défini sans jamais s'inspirer de ce qui
| se fait dans d'autres langages ?

Le C++ s'inspire de la pratique existante d'autres langages. Et c'est
une bonne chose. Mais je crois que l'on doit se garder de genéraliser
les perceptions reçues d'une solution à un exercice de classe au
contexte de C++ en oubliant d'autres contraintes et les intéractions
entre les différents apects du langage. Les exercices académiques ont
ceci de plaisant et remarquable qu'ils ont tendance à ignorer la
réalité et travailler sur des problèmes *idéaux*. Ils doivent être
tenus en compte, mais proprement placés dans leurs contextes.

-- Gaby
Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| Gabriel Dos Reis writes:
|
| > Et c'est un compilateur pour un langage largement utilisé dans la
| > programmation système, je suppose.
|
| D'ou vient cette supposition ?

Ce n'est qu'une supposition. Mais si prenses qu'elle est vraie, c'est
bien. Si tu penses qu'elle est fausse parce que c'est un langage jouet
c'est bien aussi . Mais ma nature curieuse aimerait savoir.

-- Gaby
Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| Gabriel Dos Reis writes:
|
| > struct circular_buffer {
| > circular_buffer* next;
| > circular_buffer(circular_buffer& c) : next(&c) { }
| > // ...
| > };
| >
| > circular_buffer buffer = buffer;
|
| Mais alors, comment font les programmeurs Pascal, Java, Ada, pour
| faire des listes circulaires ?

Pourquoi ne leur demandes-tu pas ? Mon petit doigt me dit que tu
aurais plus de réponses si tu poses la question dans les groupes
idiones.

-- Gaby