Pas vraiment. Dans la mésure qu'une telle définition est interdite, il
faut le dire. C'est un peu comme si on disait : « Si vous pensez
devoir modifier la même variable deux fois dans la même expression...
».
Pas vraiment. Dans la mésure qu'une telle définition est interdite, il
faut le dire. C'est un peu comme si on disait : « Si vous pensez
devoir modifier la même variable deux fois dans la même expression...
».
Pas vraiment. Dans la mésure qu'une telle définition est interdite, il
faut le dire. C'est un peu comme si on disait : « Si vous pensez
devoir modifier la même variable deux fois dans la même expression...
».
Pas vraiment. Dans la mésure qu'une telle définition est
interdite, il faut le dire. C'est un peu comme si on disait
: « Si vous pensez devoir modifier la même variable deux
fois dans la même expression... ».
i = ++i + i++;
Ça compile parfaitement, c'est légal.
Pas vraiment. Dans la mésure qu'une telle définition est
interdite, il faut le dire. C'est un peu comme si on disait
: « Si vous pensez devoir modifier la même variable deux
fois dans la même expression... ».
i = ++i + i++;
Ça compile parfaitement, c'est légal.
Pas vraiment. Dans la mésure qu'une telle définition est
interdite, il faut le dire. C'est un peu comme si on disait
: « Si vous pensez devoir modifier la même variable deux
fois dans la même expression... ».
i = ++i + i++;
Ça compile parfaitement, c'est légal.
Anthony Fleury wrote:
N'est ce dont pas une grosse erreur dans TC++PL ?
Il y a deux partie de l'énoncé. Le conseil de définir
soi-même NULL est une grosse erreur, certainement. Le
conseil de préférer 0, en revanche, relève de l'opinion
personnelle ; on peut regretter que Stroustrup n'a pas
présenté d'autres avis aussi, mais on ne peut pas lui nier
le droit à son opinion.
N'empêche que ce passage est très peu clair pour quelqu'un qui
apprend le C++ avec ce livre, et en tant que premier lien avec
le langage, ca laisse des traces !
Comme dit plus haut, comme cette définition
n'apparaissait que dans les en-tête <cX> avec X un nom
d'en-tête C, je pensais pas que le fait que ce soit une
macro était obligatoire en C++. Pour moi la norme du C++
ne définissait pas NULL.
Et qu'en fais-tu de §18.1 ?
§18.1 parle de NULL définie dans <cstddef>, donc tout découle
de la même erreur qu'au dessus. Le point 4 nous dit que NULL
est une macro dont la définition respecte le §4.10, qui dit ce
que j'ai énoncé plus haut. Pour moi (et toujours dans la même
idée), cette macro était définie comme ca pour que l'inclusion
de <cstddef> soit possible en C++, donc avec une macro NULL
compatible.
Je crois qu'il y a un consensus pour dire que cette
situation est lamentable, ou au moins, moins d'idéale. Pas,
en revanche, sur ce qu'il faut faire en consequence. (Je
crois qu'il y a une proposition devant le gremium C++ pour
une véritable solution -- Gaby pourrait peut-être en donner
plus de détails. Je serais pour, ne serait-ce que pour
arrêter toutes ces discussions interminables:-).)
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf
Celle ci ?
J'avais lu aussi suite à un lien donné par Gabriel Dos Reis
ici même. Ca a l'air interessant en effet. Pour ma part je ne
vois pas toute l'implication de la proposition, vu qu'hormis
dans cette discussion, je n'ai jamais eu de problème avec un
pointeur null en C++.
Personnellement, et ça n'engage que moi, je trouve qu'on
pourrait bien introduire une catégorie supplémentaire des
erreurs, entre un comportement indéfini et un diagnostique
obligatoire, qui délimite les dégats possibles à la phase de
compilation -- si le compilateur ne râle pas, ça doit
marcher. Parce que ce genre de cas n'est pas rare dans la
norme. (Mais ce n'est pas si évident que ça -- si ensuite
d'une inclusion « cachée » d'un en-tête, tu vois plus ou
moins d'un ensemble de fonctions surchargées, la résolution
du surcharge peut bien être différente, sans pour autant
provoquer une erreur de compilation.)
Et dans ce cas, bonjour l'amusement pour debugger aussi...
Surtout quand c'est la première fois qu'on tombe sur le
problème.
Tout à fait. Encore que je dois dire que chaque fois que
j'ai vu oùla question s'est posée, la décision s'est faite
pour NULL, plutôt que 0.
C'est une sorte de "mot clé" notamment pour tout ceux qui ont
fait du C. (pas taper sur l'expression "mot clé", mais j'ai
pas trouvé mieux) C'est donc en effet plus clair pour tout le
monde, et tous les relecteurs du code.
Anthony Fleury wrote:
N'est ce dont pas une grosse erreur dans TC++PL ?
Il y a deux partie de l'énoncé. Le conseil de définir
soi-même NULL est une grosse erreur, certainement. Le
conseil de préférer 0, en revanche, relève de l'opinion
personnelle ; on peut regretter que Stroustrup n'a pas
présenté d'autres avis aussi, mais on ne peut pas lui nier
le droit à son opinion.
N'empêche que ce passage est très peu clair pour quelqu'un qui
apprend le C++ avec ce livre, et en tant que premier lien avec
le langage, ca laisse des traces !
Comme dit plus haut, comme cette définition
n'apparaissait que dans les en-tête <cX> avec X un nom
d'en-tête C, je pensais pas que le fait que ce soit une
macro était obligatoire en C++. Pour moi la norme du C++
ne définissait pas NULL.
Et qu'en fais-tu de §18.1 ?
§18.1 parle de NULL définie dans <cstddef>, donc tout découle
de la même erreur qu'au dessus. Le point 4 nous dit que NULL
est une macro dont la définition respecte le §4.10, qui dit ce
que j'ai énoncé plus haut. Pour moi (et toujours dans la même
idée), cette macro était définie comme ca pour que l'inclusion
de <cstddef> soit possible en C++, donc avec une macro NULL
compatible.
Je crois qu'il y a un consensus pour dire que cette
situation est lamentable, ou au moins, moins d'idéale. Pas,
en revanche, sur ce qu'il faut faire en consequence. (Je
crois qu'il y a une proposition devant le gremium C++ pour
une véritable solution -- Gaby pourrait peut-être en donner
plus de détails. Je serais pour, ne serait-ce que pour
arrêter toutes ces discussions interminables:-).)
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf
Celle ci ?
J'avais lu aussi suite à un lien donné par Gabriel Dos Reis
ici même. Ca a l'air interessant en effet. Pour ma part je ne
vois pas toute l'implication de la proposition, vu qu'hormis
dans cette discussion, je n'ai jamais eu de problème avec un
pointeur null en C++.
Personnellement, et ça n'engage que moi, je trouve qu'on
pourrait bien introduire une catégorie supplémentaire des
erreurs, entre un comportement indéfini et un diagnostique
obligatoire, qui délimite les dégats possibles à la phase de
compilation -- si le compilateur ne râle pas, ça doit
marcher. Parce que ce genre de cas n'est pas rare dans la
norme. (Mais ce n'est pas si évident que ça -- si ensuite
d'une inclusion « cachée » d'un en-tête, tu vois plus ou
moins d'un ensemble de fonctions surchargées, la résolution
du surcharge peut bien être différente, sans pour autant
provoquer une erreur de compilation.)
Et dans ce cas, bonjour l'amusement pour debugger aussi...
Surtout quand c'est la première fois qu'on tombe sur le
problème.
Tout à fait. Encore que je dois dire que chaque fois que
j'ai vu oùla question s'est posée, la décision s'est faite
pour NULL, plutôt que 0.
C'est une sorte de "mot clé" notamment pour tout ceux qui ont
fait du C. (pas taper sur l'expression "mot clé", mais j'ai
pas trouvé mieux) C'est donc en effet plus clair pour tout le
monde, et tous les relecteurs du code.
Anthony Fleury wrote:
N'est ce dont pas une grosse erreur dans TC++PL ?
Il y a deux partie de l'énoncé. Le conseil de définir
soi-même NULL est une grosse erreur, certainement. Le
conseil de préférer 0, en revanche, relève de l'opinion
personnelle ; on peut regretter que Stroustrup n'a pas
présenté d'autres avis aussi, mais on ne peut pas lui nier
le droit à son opinion.
N'empêche que ce passage est très peu clair pour quelqu'un qui
apprend le C++ avec ce livre, et en tant que premier lien avec
le langage, ca laisse des traces !
Comme dit plus haut, comme cette définition
n'apparaissait que dans les en-tête <cX> avec X un nom
d'en-tête C, je pensais pas que le fait que ce soit une
macro était obligatoire en C++. Pour moi la norme du C++
ne définissait pas NULL.
Et qu'en fais-tu de §18.1 ?
§18.1 parle de NULL définie dans <cstddef>, donc tout découle
de la même erreur qu'au dessus. Le point 4 nous dit que NULL
est une macro dont la définition respecte le §4.10, qui dit ce
que j'ai énoncé plus haut. Pour moi (et toujours dans la même
idée), cette macro était définie comme ca pour que l'inclusion
de <cstddef> soit possible en C++, donc avec une macro NULL
compatible.
Je crois qu'il y a un consensus pour dire que cette
situation est lamentable, ou au moins, moins d'idéale. Pas,
en revanche, sur ce qu'il faut faire en consequence. (Je
crois qu'il y a une proposition devant le gremium C++ pour
une véritable solution -- Gaby pourrait peut-être en donner
plus de détails. Je serais pour, ne serait-ce que pour
arrêter toutes ces discussions interminables:-).)
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf
Celle ci ?
J'avais lu aussi suite à un lien donné par Gabriel Dos Reis
ici même. Ca a l'air interessant en effet. Pour ma part je ne
vois pas toute l'implication de la proposition, vu qu'hormis
dans cette discussion, je n'ai jamais eu de problème avec un
pointeur null en C++.
Personnellement, et ça n'engage que moi, je trouve qu'on
pourrait bien introduire une catégorie supplémentaire des
erreurs, entre un comportement indéfini et un diagnostique
obligatoire, qui délimite les dégats possibles à la phase de
compilation -- si le compilateur ne râle pas, ça doit
marcher. Parce que ce genre de cas n'est pas rare dans la
norme. (Mais ce n'est pas si évident que ça -- si ensuite
d'une inclusion « cachée » d'un en-tête, tu vois plus ou
moins d'un ensemble de fonctions surchargées, la résolution
du surcharge peut bien être différente, sans pour autant
provoquer une erreur de compilation.)
Et dans ce cas, bonjour l'amusement pour debugger aussi...
Surtout quand c'est la première fois qu'on tombe sur le
problème.
Tout à fait. Encore que je dois dire que chaque fois que
j'ai vu oùla question s'est posée, la décision s'est faite
pour NULL, plutôt que 0.
C'est une sorte de "mot clé" notamment pour tout ceux qui ont
fait du C. (pas taper sur l'expression "mot clé", mais j'ai
pas trouvé mieux) C'est donc en effet plus clair pour tout le
monde, et tous les relecteurs du code.
On Sun, 08 May 2005 17:53:59 +0200, James Kanze :-- Les pointeurs de Java ne sont pas des objets en soi -- en ne
peut pas en prendre l'adresse, par exemple.
-- Le Java ne supporte pas l'arithmétique sur des pointeurs.
C'est ce qu'on appelle "référence" en C++, non ?
On Sun, 08 May 2005 17:53:59 +0200, James Kanze <kanze@none>:
-- Les pointeurs de Java ne sont pas des objets en soi -- en ne
peut pas en prendre l'adresse, par exemple.
-- Le Java ne supporte pas l'arithmétique sur des pointeurs.
C'est ce qu'on appelle "référence" en C++, non ?
On Sun, 08 May 2005 17:53:59 +0200, James Kanze :-- Les pointeurs de Java ne sont pas des objets en soi -- en ne
peut pas en prendre l'adresse, par exemple.
-- Le Java ne supporte pas l'arithmétique sur des pointeurs.
C'est ce qu'on appelle "référence" en C++, non ?
Fabien LE LEZ writes:Bon, on va dire que la notion de pointeur en Java est à
mi-chemin entre les pointeurs et les références en C++ ;-)
Y'a des grands débats pour savoir si il y a des « pointeurs »
en Java. Vu qu'il y a un java.lang.NullPointerException, on
serait tenté de dire oui, mais on dit aussi qu'on ne manipule
que des références.
Si j'ai bien compris, la version officielle est que la
variable est une référence, et sa valeur est un pointeur.
Fabien LE LEZ <gramster@gramster.com> writes:
Bon, on va dire que la notion de pointeur en Java est à
mi-chemin entre les pointeurs et les références en C++ ;-)
Y'a des grands débats pour savoir si il y a des « pointeurs »
en Java. Vu qu'il y a un java.lang.NullPointerException, on
serait tenté de dire oui, mais on dit aussi qu'on ne manipule
que des références.
Si j'ai bien compris, la version officielle est que la
variable est une référence, et sa valeur est un pointeur.
Fabien LE LEZ writes:Bon, on va dire que la notion de pointeur en Java est à
mi-chemin entre les pointeurs et les références en C++ ;-)
Y'a des grands débats pour savoir si il y a des « pointeurs »
en Java. Vu qu'il y a un java.lang.NullPointerException, on
serait tenté de dire oui, mais on dit aussi qu'on ne manipule
que des références.
Si j'ai bien compris, la version officielle est que la
variable est une référence, et sa valeur est un pointeur.
est-ce qu'on pourrait écrire un glaneur de cellules en Java ?
Allez, une petite réponse passe-partout pour le plaisir...
"Java est Turing-complete"
est-ce qu'on pourrait écrire un glaneur de cellules en Java ?
Allez, une petite réponse passe-partout pour le plaisir...
"Java est Turing-complete"
est-ce qu'on pourrait écrire un glaneur de cellules en Java ?
Allez, une petite réponse passe-partout pour le plaisir...
"Java est Turing-complete"
i = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
i = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
i = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
Je rajoute i=0 pour la suitei = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
Tu es sur ? J'aurais effectivement dit que c'était un comportement
"indéfini" dans la mesure où le compilo a le droit d'évaluer ++i ou
i++ dans l'ordre qu'il veut.
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2
+ 0 (ce qui fait la même chose, ce qui n'aurait pas été le cas avec
i = ++i + i-- (i=1+1 ou i=0+0)).
Je rajoute i=0 pour la suite
i = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
Tu es sur ? J'aurais effectivement dit que c'était un comportement
"indéfini" dans la mesure où le compilo a le droit d'évaluer ++i ou
i++ dans l'ordre qu'il veut.
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2
+ 0 (ce qui fait la même chose, ce qui n'aurait pas été le cas avec
i = ++i + i-- (i=1+1 ou i=0+0)).
Je rajoute i=0 pour la suitei = ++i + i++;
Juste au cas où : ce n'est pas légal, c'est un comportement
indéfini. C-à-d que le compilateur n'est pas obligé à émettre un
avertissement, et que le langage ne donne aucune signification à
l'expression -- quoiqu'il arrive (y compris le formattage du
disque dur), le compilateur a raison.
Tu es sur ? J'aurais effectivement dit que c'était un comportement
"indéfini" dans la mesure où le compilo a le droit d'évaluer ++i ou
i++ dans l'ordre qu'il veut.
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2
+ 0 (ce qui fait la même chose, ce qui n'aurait pas été le cas avec
i = ++i + i-- (i=1+1 ou i=0+0)).
On Mon, 9 May 2005 13:16:27 +0200, "Vincent Lascaux"
:S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
La norme n'impose rien, donc un compilateur qui renverrait autre chose
que 2 serait parfaitement en accord avec la norme (d'après ce que j'ai
compris du message de James). Par contre, on pourrait de poser des
questions sur la qualité du compilateur, et avoir une légère tendance
à en essayer un autre à la place...
On Mon, 9 May 2005 13:16:27 +0200, "Vincent Lascaux"
<nospam@nospam.org>:
S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
La norme n'impose rien, donc un compilateur qui renverrait autre chose
que 2 serait parfaitement en accord avec la norme (d'après ce que j'ai
compris du message de James). Par contre, on pourrait de poser des
questions sur la qualité du compilateur, et avoir une légère tendance
à en essayer un autre à la place...
On Mon, 9 May 2005 13:16:27 +0200, "Vincent Lascaux"
:S'il évalue en premier ++i, ca fait i = 1 + 1, sinon, ca fait i = 2 + 0 (ce
qui fait la même chose, ce qui n'aurait pas été le cas avec i = ++i + i--
(i=1+1 ou i=0+0)).
La norme n'impose rien, donc un compilateur qui renverrait autre chose
que 2 serait parfaitement en accord avec la norme (d'après ce que j'ai
compris du message de James). Par contre, on pourrait de poser des
questions sur la qualité du compilateur, et avoir une légère tendance
à en essayer un autre à la place...