bonsoir
pourquoi l'incrémentation ne fonctionne pas dans ce cas?
Code:
1
2
3 int coucou = 3; coucou = (expression) ? coucou++ : coucou--;
Version imprimable
bonsoir
pourquoi l'incrémentation ne fonctionne pas dans ce cas?
Code:
1
2
3 int coucou = 3; coucou = (expression) ? coucou++ : coucou--;
Chez moi ça fonctionne très bien :bug:
Edit: j'ai rien dit. Ca bug avec n'importe quel variable constante.
el solutione :
Code:
1
2
3 int coucou=3; coucou = (expression) ? ++coucou : --coucou;
Bien sur que ça fonctionne... Seulement l'opérateur suffixé renvoie une copie non incrémenté.
Mais alors, pourquoi dans
coucou devient 4 ? :p Quel différence entre une constante et une mutable dans ce cas ci ?Code:
1
2
3 const bool a = true; int coucou = 3; coucou = ((a) ? (coucou++) : (coucou--));
C'est dû à une optimisation du compilo ?
Avec ton code coucou vaut 3 hein.
par contre avec :
coucou = ((a) ? (++coucou) : (--coucou));
coucou vaudra 4. Y'a pas d'histoire de constance ou non/
Dans tout les cas, j'écrirais plutôt :
a ? ++coucou : --coucou;
..
Je t'assure que la valeur de coucou est différente si a est une constante ou non.
C'est pas très logique par contre, je te l'accorde.
En effet autant pour moi j'avais mal compris ce que tu disais. Donc oui la selon si l'expression est constante ou pas ça change, mais j'avoue que je connais pas la raison.
Fait plus étonnant j'ai ce comportement que sur gcc 4.3 et pas sur gcc 3.4.5 ... définitivement je capte pas.
En gros si l'expression est non constante : le comportement est celui attendu. (enfin celui que moi je crois attendu), ie coucou vaut 3.
Si l'expression testé dans la condition est constante alors coucou vaut 4 et je m'explique pas pourquoi.
Pas de problème Goten.
Je pense que c'est un bug interne à GCC peut-être dû à une optimisation mal foutue.
Quel est la version de ton compilateur Elay ?
"i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465)" dans mon cas.
@ nuKs je suis sous visual studio 2008
Ok, ça confirme bien un bug.
Je pense que GCC optimise
enCode:
1
2
3
4 const bool a = true; int coucou = 3; coucou = ((a) ? (coucou++) : (coucou--)); std::cout << coucou; // 4
Par contreCode:
1
2
3 int coucou = 3; coucou = coucou++; std::cout << coucou; // Toujours 4 :/
Code:
1
2
3
4 int coucou = 3; int tmp = coucou++; coucou = tmp; std::cout << coucou; // 3 :)
même dans ton exemple je ne comprend pas le
Code:
1
2
3 int temp = coucou++; // coucou est incremente mais n'est pas copié dans temp !
En fait, lors de cette ligne, temp doit être égale à coucou avant l'incrémentation, et coucou doit donc augmenter de valeur après.
Tout fonctionne donc normalement pour cette ligne là. En fait la dernière portion de code que j'ai écrite était juste une manière détournée d'écrire coucou = coucou++;, mais le résultat aurait du être le même dans les deux cas (c'est à dire 3).
Edit: Fait étonnant:
Retourne "Normalité, mais...x1 == y1". Donc la condition fonctionne comme si la valeur de x valait toujours 0, mais elle est tout de même incrémenté. En gros x vaut 0 mais x vaut 1 8OCode:
1
2
3
4
5
6
7
8 int x = 0, y = 0; if((x = x++) == (y = ++y)) { std::cout << "Etrangeté"; } else { std::cout << "Normalité, mais..."; // std::cout << "x" << x << " == y" << y; // x1 == y1 }
ah yes ça se tient !
int x=0, y=0;
(x = x++) => Doit retourner x, et x doit valoir 0.
(y = ++y) => Doit retourner y, et y doit valoir 1.
Dans l'expression du if, c'est bel et bien ce qui se passe, car (x=x++)==(y=++y) renvoi false sous mon compilo.
Par contre, après cela x vaut 1, alors qu'il devrait toujours valoir 0.
Donc en gros, à un moment donné, x vaut 0 et d'un coup il décide de devenir 1 :aie:
Vous avez jamais eu a surchargé l'op++ ? La version préfixé travaille sur l'objet. La version suffixé fait une copie, incrémente l'objet et renvoie la copie.
c'est un comportement inféfini tout ca
http://en.wikipedia.org/wiki/Sequence_pointCode:
1
2
3 yngwe@FRY:~$ gcc main.c -Wall -Wextra main.c: In function 'main': main.c:4: warning: operation on 'x' may be undefined
Ok, merci, le mystère est résolu.
Je pensais que la priorité des opérateurs gérait ce genre de cas.
Ma soif de connaissance est assouvie :)
@Goten: regarde l'avant-dernier code que j'ai écris à la première page.