Comportement étrange ...

Résolu
clempar55 Messages postés 59 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 4 avril 2007 - 11 oct. 2006 à 19:22
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 - 12 oct. 2006 à 18:17
J'ai fait un petit programme tout à l'heure pour voir si on pouvait incrementer un double et j'ai fait le test suivant:

    double d=32.5;
    printf(" d=%f  \n d++=%f  \n d=%f  \n", d , d++ , d );

Cela peut ne pas paraitre très clair, mais le fonctionnement est sensé être simple: on affiche la valeur de d, puis la valeur de d++ , et enfin la valeur de d incrémentée. La console devrait donc afficher:

    d=32.500000000
    d++=32.50000000
    d=33.500000000

Mais elle affiche en fait :

    d=33.500000
    d++=33.500000
    d=32.500000
Je me demandais ce qui peut bien etre responsable de ce comportement. Es-ce le compilo( j'utilise GCC )? Ou bien une mauvaise utilisation de l'operateur ++ , ou enfin la fonction printf ?
Merci

10 réponses

rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 oct. 2006 à 20:35
C'est un probleme du a l'appel du ++ dans une pile d'argument , en effet rien ne te dit que les arguments sont appelés l'un a la suite de l'autre pour t'en convaicre

#include <stdio.h>
#include <stdlib.h>
int aff(int nb)
{
printf("appel de aff(%d)\n",nb);
return nb;
}
int main()
{
    printf("%d %d %d\n",aff(0),aff(1),aff(2));
    system("pause");
    return 0;
}

Louis
3
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 oct. 2006 à 20:36
oups dsl pour le double post j'oubliais, le ++ est utilisable avec les doubles ^^
#include <stdio.h>
#include <stdlib.h>

int main()
{
    double n = 2;
    printf("%llf\n",n);
    n++;
    printf("%llf\n",n);
    system("pause");
    return 0;
}
3
Utilisateur anonyme
11 oct. 2006 à 19:41
Ben...non...si ?
La ligne d++ doit affiché 33.500000, c'est ce qu'elle fait...! ton code marche, ou alors j'ai pas suivi lol
0
Utilisateur anonyme
11 oct. 2006 à 19:43
oups désolé j'ai rien dis j'ai mal lu, OUBLIS
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
11 oct. 2006 à 20:32
Sauf erreur de ma part, l'opérateur "++" est défini seulement pour les int. Pour tous les autres types, comportement non garantis...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
clempar55 Messages postés 59 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 4 avril 2007
11 oct. 2006 à 21:21
Donc il fallait juste éviter d'utiliser ++ de cette manière.
Merci rrk275 pour ta réponse.
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
11 oct. 2006 à 23:00
Pour un peu plus d'infos je vais expliquer rapidement des principes du fonctionnements d'appel d'une fonction .. ( vite fait .. je suis pas expert ^^)
en gros , il met les arguments dans une pile , les fonctions etant calculé a l'empilement , seulement une fois dans ta fonction il depile le premier en 1er, donc le dernier en dernier, et le dernier est celui le plus en dessous donc celui qui a été empilé le premier .. cela explique cet ordre d'appel et il faut donc faire attention quand on appelle plusieurs fonctions dans des arguments ^^
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
11 oct. 2006 à 23:08
Les fonctions sont pour la plupart en __stdcall ou en __cdecl (et pas en pascal), ce qui signifie qu'il pushe les paramètres de droite à gauche dans la pile.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 oct. 2006 à 00:45
printf, sprintf et autres variantes sont en __cdecl pour cause de nbr de params indéfinis, il n'y a donc que l'appelant qui puisse dépiler car il est le seul à en connaitre le nombre.

ciao...
BruNews, MVP VC++
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
12 oct. 2006 à 18:17
Ah .. me basait sur des constatation personelle.. dsl ^^ heuresement que quelqu'un a su me remettre dans le bon chemin... je m'en vais de ce pas taper sur google me renseigner sur ces __cdecl ..
Louis
0
Rejoignez-nous