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 :

la portée du mot clé static après l'appel de fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut la portée du mot clé static après l'appel de fonction
    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
    22
    23
     
    #include<stdio.h>
     
    void Afficher()
    {
    static int x=0;
    int y=0;
    printf("x==%d, y==%d",x,y);
    x++;
    y++;
    }
     
    int main()
    {
    printf("-1-\n");
    Afficher();
    printf("-2-\n");
    Afficher();
    printf("-3-\n");
    Afficher();
     
    return 1;
    }
    le resultat est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    -1-
    x==0, y==0
     
    -2-
     
    x==1, y==0
     
    -3-
     
    x==2, y==0
    ma question est la suivante:
    pourquoi il n'a pu eu destruction de la valeur de x après chaque appel de fonction et pourtant que x n'est pas une variable global??

    et je ne sais pas si c'est l'occasion aussi de poser la question sur les différents type en C (je veux dire register, static, const...)???

    merci d'avance!

  2. #2
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Il ne faut pas confondre portée et durée de vie.

    Dans ton exemple, la variable "x" à une portée sur la fonction Afficher() mais sa durée de vie est la durée du programme.

    Cette variable ne peut être référencée par ton code qu'à l'intérieur de la fonction Afficher(). Par contre, cette variable n'est modifiée lorsque tu sors de la fonction et que tu y reviens.

    en ce qui concerne les qualifiant register et const :
    "register" indique que le développeur souhaite que cette variable soit stockée dans un registre du micro processeur. C'est un souhait et non une obligation, le compilateur fait de toute façon comme il veut (ou peut). C'était peut être utile il y a quelques années pour optimiser certains algo mais maintenant je doute que cela ait une quelconque utilité. Les optimiseurs de code font en général mieux que ce ne ferait un développeur.

    "const" indique que la variable ne peut pas être modifiée. C'est une indication donnée par le développeur et le compilateur met en place des controles supplémentaires lors de la compilation pour vérifier que cette variable n'est pas modifiée par le code.

    Dans certains environnements embarqués, cela peut avoir pour impact de placer la variable dans un segment de ROM au lieu de RAM vu que cette variable n'est pas modifiable.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    pourquoi il n'a pu eu destruction de la valeur de x après chaque appel de fonction et pourtant que x n'est pas une variable global??
    Justement si, c'est une "variable globale" (le terme exact est variable permanente). Seulement, seule la fonction Afficher sait que cette variable existe. Soit la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int * get_address_of_x(void)
    {
        static int x;
        return &x;
    }
    Seule la fonction get_address_of_x sait qu'il y a une variable permanente nommée "x" (tu peux toujours déclarer d'autres variables locales de même nom dans les autres fonctions). Cependant, comme x est une variable permanente, get_address_of_x peut retourner son adresse sans danger. Ecrire *get_address_of_x() = 1; pour modifier x est alors correct.

    [Tutoriel] Classe et portée d'une variable

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

Discussions similaires

  1. [IE] Click droit - Paste valeur insérée après l'appel de fonction
    Par Stessy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/02/2011, 14h07
  2. Réponses: 1
    Dernier message: 10/09/2006, 13h23
  3. Mot-clé static
    Par Zanton dans le forum Langage
    Réponses: 9
    Dernier message: 19/05/2006, 11h13
  4. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20
  5. mot-clef static
    Par keil dans le forum C++
    Réponses: 8
    Dernier message: 25/01/2006, 17h11

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