Demande d'explication

Résolu
jeancrien1121 Messages postés 18 Statut Membre -  
karirovax Messages postés 3584 Statut Membre -
Bonjour à tous, j'ai examen en principe et méthode de programmation lundi et j'ai encore pas mal de lacune et c'est pour cela que je viens solliciter votre aide.
Petite exemple je ne comprend pas pourquoi dans ce programme :
int a = 0, x = 11;
while (x--)
printf("A = %d\n",a++);
printf("X =%d\n",x++);

a la fin de de cette boucle X vaudra -1 et A vaudra 10
A mon sens ce serai une boucle infini étant donner qu'il diminue x mais le rajoute en gros ça valeur serait 10 - 11 - 10 - 11 ensuite pourquoi x s'arrête a -1 à 0 j'aurai compris mais a -1 je me dis qui devrait continuer et la encore boucle infini :s
Alors voila, je vous remercie d'avance pour le temps que vous me consacrerez :)

2 réponses

fiddy Messages postés 11653 Statut Contributeur 1 847
 
Attention, il n'y a pas d'accolades apres le while. Seule la 1ere instruction suivante fait donc partie du while.
De plus afficher x++ revient à afficher x et à faire x=x+1.
Avec ces deux éléments tu devrais comprendre.
0
jeancrien1121 Messages postés 18 Statut Membre
 
Je vous remercie pour vos réponse cela m'aide énormément :D mais comment savoir quand la boucle while ce finit ? j'ai noter dans mon cours boucle while tant que different de 0 = vrai et continue mais la a mon sens il devrait s'arrêter a 0 :s ou me suis tromper ou je comprend pas grand chose :D
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut Jean,

Lis attentivement la réponse de Char Snipeur.

Voilà une illustration.

Compare le résultat de :

#include <stdio.h>

int main(void)
{
    int a = 0, x = 11;
    while (x--)
        printf("A = %d et X = %d\n", a++, x);
    printf("after the while loop X = %d\n", x);
    printf("printing x++ = %d\n", x++);
    printf("in fact now X = %d\n", x);

    return 0;
}

et de

#include <stdio.h>

int main(void)
{
    int a = 0, x = 11;
    while (--x)
        printf("A = %d et X = %d\n", a++, x);
    printf("after the while loop X = %d\n", x);
    printf("printing x++ = %d\n", x++);
    printf("in fact now X = %d\n", x);

    return 0;
}


et tu comprendras ce qu'il explique et pourquoi il y a une décrémentation après évaluation (pareil pour ce qui se passe avec le printf sur x++).

Dans les deux cas, while s'arrête quand x est évalué à 0. Cependant, selon que tu écrives --x ou x--, la décrémentation de x se produira respectivement avant ou après l'évaluation de x.

Dans la vraie vie, ce type de style d'écriture de code est à fuir et à proscrire, tellement il est cryptique.


Dal
0
jeancrien1121 Messages postés 18 Statut Membre
 
Merci énormément pour vos réponse j'ai fini par comprendre la petite nuance --' :p
Enfin je croit :p
Dans le premier cas il va décrémenter après avoir vérifier si la condition est vrai et meme si elle est fausse il décrémentera mais n'effectuera pas l'action et dans le deuxième cas il décrémentera avant de vérifier la condition.
en tous cas merci a vous tous :)
0
karirovax Messages postés 3584 Statut Membre 204
 
salut

ajoutez entre les parenthèse une double condition comme while ( x<11 & x=0 ) par exemple et la boucle va arrêter si x vaut 0 ou ajoutez une condition IF instruction et voilà

je suis pas professionnel mais le code est mal structuré .
0
jeancrien1121 Messages postés 18 Statut Membre
 
Enfet kariroxav, mon prof a donnée un exemple d'examen en classe ou il disait que la première question il y aurai le même genre a l examen avec des valeur différente et la question est qu'elles seront les dernière valeurs affichées pour a et x sur le bout de code que j'ai déjà inscrit plus haut. Croit moi je ne coderai pas comme ça j'y voit pas l'intérêt je suis quelqu'un qui fais tous pour me faciliter la vie en générale :p
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Je compléte un peu quand même. Il y a la pré incrémantation (respectivement décrémentzation) ++x et la post-incrémanentation (respectivement décrementation) x++.
La différence, c'est que dans le premier cas tu effectues l'opération sur la variable avant l'instruction, dans le deuxième cas après l'instruction.
Il ne faut pas abusé de ces opérateurs, car ils peuvent donner un source assze illisible.
0