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

C Discussion :

Confirmation demandée sur modification de fin de boucle


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut Confirmation demandée sur modification de fin de boucle
    Bonjour à tous

    et d'abord toutes mes excuses pour ne pas être présent sur le forum depuis presque 1 an. Je reviendrai à la rentrée..

    Je viens vous solliciter car j'ai besoin d'une confirmation.

    Il me semble que, lorsqu'on crée une boucle, l'indice de fin est stocké par le compilateur au démarrage, et que donc si on le modifie en cours de route, la nouvelle valeur n'est pas prise en compte. C'était comme ça que ça fonctionnait avant (il y a 15 ou 20 ans). Est-ce bien toujours vrai aujourdhui ?

    Par exemple :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ( i = 0 ; i < n ; i++ )
    {
      ....
      if ( ..)
         n = n - 1 ;
    }

    ira jusqu'au n initial et non pas le n modifié.

    C'est bien toujours le cas ?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La boucle for(a;b;c) ne comporte pas de notion d'indice. Elle utilise trois expressions
    - a est une expression (à effets de bord sinon elle est inutile) évaluée une seule fois à l'entrée de la boucle.
    - b, expression à caractère booléen, est évaluée avant chaque exécution du contenu de la boucle et est donc réévaluée à chaque fois avant que la boucle se répète. Si le résultat de l'évaluation est vrai, on exécute le contenu de la boucle, sinon on sort de la boucle
    - c est une expression (à effets de bord sinon elle est inutile) évaluée après chaque exécution du contenu de la boucle.

    Donc, si la condition b (vraie) est modifiée par l'exécution du code qui suit, cette modification sera prise en compte lors de l'évaluation suivante de b;
    Ainsi le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    int main(void)
    {
        int i;
        int n = 8;
        for(i=0; i<n ;i++)
        {
           printf("i=%d;n=%d ",i);
           n--;
        }
        printf("\n");
     
        for(i=0,n= 8; i<n ;n--)
        {
           printf("i=%d;n=%d ",i);
           i++;
        }
         printf("\nTermine\n");
         return 0;
    }
    donnera
    i=0;n=8 i=1;n=7 i=2;n=6 i=3;n=5
    i=0;n=8 i=1;n=7 i=2;n=6 i=3;n=5
    Termine
    Je crois que cela a toujours été comme ça.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Salut !

    Trop occupé à polémiquer sur des sujets non C ? J'espère que tu vas bien et qu'on te reverra bientôt ici

    N'ayant pas fait de C il y a 15 ou 20 ans, ma première idée était que "oui, n est modifiée". J'ai fait un test avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
    {
        int change = 1;
        int n = 5;
     
        for (int i = 0 ; i < n ; i++)
        {
            printf("n=%d, i=%d\n", n, i);
     
            if (change == 1)
            {
                n = n - 1 ;
                change = 0;
            }
        }
     
        return n;
    }
    Compilation avec gcc sous Mac OS X.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ gcc --version && ./a.out 
    i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     
    n=5, i=0
    n=4, i=1
    n=4, i=2
    n=4, i=3
    Cela répond-il à ta question ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    - b, expression à caractère booléen, est évaluée avant chaque exécution du contenu de la boucle et est donc réévaluée à chaque fois avant que la boucle se répète. Si le résultat de l'évaluation est vrai, on exécute le contenu de la boucle, sinon on sort de la boucle
    ....
    Je crois que cela a toujours été comme ça.
    Merci de l'explication , mais je ne crois pas que cela ait toujours été comme ça. Entendons-nous bien :

    • Pour l'évaluation, oui, bien sûr
    • En ce qui concerne la prise en compte de la modification de n, il me semble me souvenir que j'avais eu des problèmes, parce que justement à la compil la variable était stockée je ne sais pas où, ce qui fait que la boucle démarrait avec une valeur et continuait à tester avec cette valeur. Alors peut-être que j'avais d'autres bugs, mais c'est pour ça que je vous demandais confrrmation : dans ma pratique dans les années 90 ça se passait comme ça...





    Citation Envoyé par Bktero Voir le message
    Trop occupé à polémiquer sur des sujets non C ?
    En partie mais surtout je suis occupé à quasi temps plein depuis septembre à terminer une série d'articles de maths.


    Citation Envoyé par Bktero Voir le message
    J'espère que tu vas bien et qu'on te reverra bientôt ici
    ça va bien oui, et je reviendrai, c'est promis


    Citation Envoyé par Bktero Voir le message
    Cela répond-il à ta question ?
    Tout à fait..


    Un grand merci à vous deux

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/04/2015, 21h34
  2. [Toutes versions] Demande de Modif sur macro recherche doublons
    Par Aladin_23 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 03/06/2014, 21h54
  3. Sélection d'un enregistrement de la table sur modif TDBEdit
    Par lawale125 dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/09/2004, 17h54

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