IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage C++ Discussion :

Problème boucle for


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut Problème boucle for
    Bonsoir,

    Je suis un cours de débutant en C++ et je bloque sur la dernière question bonus de mon devoir, à savoir:

    On me demande de rédiger volontairement le code "erroné" suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
    	char i;
    	for (i = 1; i < 10, i++;)
    	{
    		cout << (i+1) <<endl;
    	}
    	return 0;
    }
    La question est: avec la boucle "for" de la question précédente, la boucle s'arrêtait dès lors que i prenait la valeur 10. Est-ce le cas ici ? Et pourquoi ? A quelle valeur de i le programme s'arrête-t-il ?
    Honnêtement, je ne suis pas sur de comprendre.
    Ici, clairement la réponse est non, ça ne s'arrête pas à i=10. Le programme s'arrête lorsque i prend la valeur de 0.
    Je pense que la présence de la virgule après le i<10 rend justement l'argument i<10 inutile, et le "i++" devient la condition. En fait, j'ai l'impression que le programme vérifie "i" et incrémente "++" si "i" est vrai.
    L'affichage que donne le code est le suivant:
    3
    4
    (...)
    128
    -127
    -126
    (...)
    -1
    0
    1

    Je constate que le programme s'arrête à la valeur 128 et "fais un demi-tour" en valeurs négatives. Cette valeur 128 à l'affichage, qui correspond à i=127 (vu qu'on affiche i+1), n'est pas anodine, i étant un char, sur 8-bits, la valeur est donc comprise entre -127 et 127. Je suis tombé sur cette page internet intéressante: http://www.cplusplus.com/forum/beginner/18727/ mais je ne suis pas sûr de bien comprendre. Le programme s'est-il arrêté lorsque i est "out of memory" (et dépasse les 8 bits) ?

    D'avance merci !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    En fait, ton char s'avère être signé, et codé sur 8 bits.

    en binaire, 127+1 s'écrit 0111 1111 + 0000 0001 = 1000 0000. C'est à dire, avec la notation décimale, -128. En effet, le premier bit est à 0.

    La condition d'arret est i < 10 , i++. Comment s'évalue cette expression?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Tu es victime d'overflow.
    C'est plus simple à imager avec des unsigned:
    unsigned char a un range de [0, 255]
    une fois à 255, si tu l'incrémentes, il va reset à 0

    Ici ta boucle s'arrêtera quand i++ retourne 0 puisque c'est l'opération à droite de l'opérateur ,
    c'est exactement ce que tu vois dans ta sortie

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    C'est donc la présence de la virgule qui rend inutile le i<10 ?
    Et je ne suis pas sur de comprendre pourquoi 3 est le premier chiffre affiché. On part de 1, on affiche 2 non ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Une boucle for se lit for(initialisation; évaluation, si c'est vrai continuer; fin de tour) et, comme tu l'auras peut-être compris, l'évaluation est faîte dès le début, pour ne pas effectuer un tour de boucle avec une condition fausse. Ca c'est le do while qui s'en charge.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut
    Donc la boucle s'arrête quand i++ dépasse la capacité char et se reset.
    A quoi sert le i<10 dans ce cas ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Maxnihilist Voir le message
    A quoi sert le i<10 dans ce cas ?
    A rien. (Enfin si, à induire le lecteur en erreur si il lit trop rapidement).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo