bonsoir
pourquoi l'incrémentation ne fonctionne pas dans ce cas?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int coucou = 3; coucou = (expression) ? coucou++ : coucou--;
bonsoir
pourquoi l'incrémentation ne fonctionne pas dans ce cas?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int coucou = 3; coucou = (expression) ? coucou++ : coucou--;
Chez moi ça fonctionne très bien
Edit: j'ai rien dit. Ca bug avec n'importe quel variable constante.
el solutione :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é.
"Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu
Mais alors, pourquoi dans
coucou devient 4 ? :p Quel différence entre une constante et une mutable dans ce cas ci ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
..
"Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu
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.
"Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu
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.
Ok, ça confirme bien un bug.
Je pense que GCC optimise
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 const bool a = true; int coucou = 3; coucou = ((a) ? (coucou++) : (coucou--)); std::cout << coucou; // 4
Par contre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int coucou = 3; coucou = coucou++; std::cout << coucou; // Toujours 4 :/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 }
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
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.
"Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu
c'est un comportement inféfini tout ca
http://en.wikipedia.org/wiki/Sequence_point
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager