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 :

questions de base


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut questions de base
    ayant décidé de reprendre correctement mes bases sur le langage C, je parcours des sites sur internet et dans l'un d'eux j'ai trouvé un exemple sur la boucle for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i=0,j=0 ; j<10 ; i++,j+=i)
        printf("L'autre message %d %d\n",i,j);
    et il est dit qu'il affiche ceci:
    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
    Le message 0
    Le message 1
    Le message 2
    Le message 3
    Le message 4
    Le message 5
    Le message 6
    Le message 7
    Le message 8
    Le message 9
    L'autre message 0 0
    L'autre message 1 1
    L'autre message 2 3
    L'autre message 3 6
    L'autre message 4 10
    la condition de rebouclage est j<10 (strictement inférieur) et pourtant on affiche tout de même la dernière ligne où j vaut 10. Est-ce normal, et dans ce cas pourquoi ?

    je pensais que lorsque i vaut 3 et j vaut 6, la condition j<10 est vérifiée, alors on refait la boucle, donc on les imprime, puis on incrémente leurs valeurs.
    d'ou i vaut 4 et j vaut 10 ce qui devrait mettre fin à la boucle (la condition j<10 n'étant pas vérifiée) et donc le printf ne devrait pas afficher la dernière ligne, non ?

    bon je sais c'est une question de base mais non seulement la réponse me rassurera ( enfin j'espère ) mais elle pourrait servir à d'autres, sait-on jamais...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut Re: question de base sur la boucle for
    Citation Envoyé par BnY
    la condition de rebouclage est j<10 (strictement inférieur) et pourtant on affiche tout de même la dernière ligne où j vaut 10. Est-ce normal, et dans ce cas pourquoi ?
    Ce n'est pas normal. Pourquoi, parce que le compilateur est légèrement stupide.

    J'ai fais le test sur MSVC toolkit 2003, PellesC, VC++ Express 2005, OpenWatcom 1.4 et même tinyCC (oui, j'ai poussé l'investigation loin car on m'avait déjà montré une erreur de ce style :p) pour voir que tous s'arrêtaient avant que j>= 10, normal quoi.

    Il faudrait voir le code assembleur généré par le programme compilé. AMHA, il s'agit d'une erreur dans du style j = j+i effectué après le test de rebouclage.

    En "méta-assembleur".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      mov [i],0
      mov [j],0
    boucle:
      inc [i] ; i++
      cmp [j], 10 
      jge fin ; => si j>=10 => fin
      add [j], [i] ; j+=i
    // printf...
      jmp boucle 
    fin:

  3. #3
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    autre petite question concernant static et return...

    le code suivant:

    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 next(){
      static value = 0;
      return value++;
    }
     
    void main(void) {
      printf("Appel 1 : %d\n",next());
      printf("Appel 2 : %d\n",next());
    }
    afficherait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >cc -o test test.c
    >test
    Appel 1 : 0
    Appel 2 : 1
    >
    du coup je me pose la question suivante:

    retourne value, puis applique l'instruction value++ ??

    je pose la question parceque je pensais que value++ était prioritaire et donc que return... retournait value= value+1 directement...

    bon c'est juste pour avoir une confirmation donc si y en a qui trouvent ca débile ben tant pis mais j'aime bien être sûr de bien comprendre avant d'apprendre bêtement ce qui est marqué, idem pour le for ( cf plus haut )...
    voila merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut
    Arf... asm rox again même en C.

    Static définit une variable qui sera en mémoire et non pas dans la pile (une variable locale quoi).

    La fonction next compilée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      mov eax,dword ptr [value]
      lea edx,dword ptr [eax+1h]
      mov dword ptr [value],edx
      retn
    le registre EAX sert à stocker et retourner le résultat de la fonction.On voit ici qu'on copie le contenu de la mémoire pointée par value avant d'incrémenter la valeur à cette même adresse. C'est le principe de la post incrémentation. Principe respecté.

    La définition "static value=0;" est uniquement prise en compte lors de l'initialisation de la zone mémoire qui servira à contenir la valeur. Elle ne figure plus à l'exécution.

    Suite au deuxième appel à next, value est à 3 même si la valeur retournée est 2, ce qui peut-être un piège.

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

Discussions similaires

  1. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  2. Réponses: 4
    Dernier message: 20/11/2005, 21h46
  3. question de base
    Par tuxedo dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/04/2005, 15h28
  4. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45
  5. Question de base
    Par xinu1.1 dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 03/02/2005, 22h14

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