Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Progression de boucle while


Sujet :

C

  1. #1
    Nouveau membre du Club
    Progression de boucle while
    Bonjour a toutes et a tous ,
    Je bute sur le cheminement de ce tout petit bout de code :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     #include <stdio.h>
     int main(){
     
     int n,p;
     n=p=0;   
     while(n<=8) n += p++;
     printf("B : n= %d\n",n);
     
    return 0;
    }

    Si je décompose j'ai :
    je rentre dans ma boucle n ayant la valeur 0. soit while(n<=8) n=0+0 . J'incremente p .
    rebelote : while(n<=8)n=0+1; (n=1)
    " : while(n<=8)n=1+1; (n=2)
    ..................
    " : while(n<=8)n=7+1; (n=8)(fin de la boucle )
    printf("B : n= %d\n",n); soit n=8

    Pourtant le bon resultat est 10 !
    Mon raisonnement est mauvais , pourquoi ?
    merci d'avance

  2. #2
    Expert confirmé
    Bonjour,

    Et p, il est incrémenté chaque fois, donc :
    n = 0 + 0, p = 1
    n = 0 + 1, p = 2
    n = 1 + 2, p = 3
    n = 3 + 3, p = 4
    n = 6 + 4, p = 5
    stop car n > 8
    d'où n = 10

  3. #3
    Nouveau membre du Club
    Ok bien compris
    Merci

  4. #4
    Nouveau membre du Club
    Si je peux me permettre , quelle nuance entre ces 2 expressions :
    n += ++p; et
    n+= ++p;
    Espace entre le n et le + sur la 1ere

  5. #5
    Expert confirmé
    Les espaces n'ont aucune signification particulière, on pourrait aussi bien revenir à la ligne ou ne rien mettre.
    Il existe de très rares cas où une séparation est importante, par exemple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    x = a+++b;
    // sans espace correspond à 
    x = a++ + b ; // post-incrémenter a et ajouter b
    // alors que :
    x = a+ ++b; // espace obligatoire après a+ : ajouter a et la pré-incrémentation de b
    // on peut aussi l'écrire :
    x =
    /* la suite */ a   // juste la a sur cette ligne
     +  ++             // tient le plus et le plus-plus sont là (avec l'espace nécessaire)
    b;                 // et pour finir le b que l'on indiqué à pré-incrémenter

  6. #6
    Nouveau membre du Club
    Ok parfait . Merci de ton aide .
    Mais on peut pas se quitter comme ca !

    Je remarque que ces 2 codes presque similaire ne produisent pas le mm resultat . Je ne saisis pas la nuance ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(){
      int n,p;
      n=p=0;
      while(n<5) n+=2 ; p++;
      printf("A: n = %d, p = %d\n",n,p);


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(){
      int n,p;
      n=p=0;
      while(n<5) { n+=2 ; p++ ; }
      printf("B: n = %d, p = %d\n",n,p);

  7. #7
    Expert confirmé
    Les accolades servent à quelque chose.
    Et le retour à la ligne, c'est comme les espaces et les commentaires, ça n'a aucun rôle particulier.

  8. #8
    Nouveau membre du Club
    Apres reflexion ,
    Dans le 1 er cas :
    Tant que n n'atteind pas la valeur de 5 , j'incremente n et seulement n de 2 a chaque tour dans la boucle , tandis que p lui , est incrementé qu'une seule fois .
    Dans le 2 eme cas :
    Tant que n n'atteind pas la valeur de 5 ,Les 2 valeurs n et p entre accolade sont incrementé a chaque tour dans la boucle .
    c'est ca ?

  9. #9
    Expert éminent sénior
    Bonjour
    Citation Envoyé par chris7522 Voir le message
    Dans le 1 er cas :
    Tant que n n'atteind pas la valeur de 5 , j'incremente n et seulement n de 2 a chaque tour dans la boucle , tandis que p lui , est incrementé qu'une seule fois .
    p est incrémenté qu'une seule fois après la boucle oui. Parce qu'en C, ce qui fait le corps de boucle ce sont les accolades et si pas d'accolade, alors seule la première instruction est incluse (en fait c'est le contraire: un corps de boucle ne se compose que d'une seule instruction mais cette instruction peut tout à fait être un bloc entre accolades)

    Citation Envoyé par chris7522 Voir le message
    Dans le 2 eme cas :
    Tant que n n'atteind pas la valeur de 5 ,Les 2 valeurs n et p entre accolade sont incrementé a chaque tour dans la boucle .
    c'est ca ?
    Exact.

    Et si je peux en rajouter sur ton premier post, évite ce genre d'instruction n += p++;. Tu ne gagneras rien en perfs par rapport à deux instructions séparées et tu mettras 3h à te relire (d'ailleurs tu n'as effectivement pas réussi à te lire !!!)
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Nouveau membre du Club
    Merci de ta reponse . Tu as raison pour toutes ces instructions qui pourrai etre bien plus simple . En fait , j'utilise un livre d'exercice en C qui passe en revu tous les cas de figure . D'ou mon harcèlement quotidien sur ce forum pour essayer de comprendre .
    Pas sur que tous ca me soit utile

###raw>template_hook.ano_emploi###