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 :

portée d'une variable locale


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut portée d'une variable locale
    bonjour,

    1)Je déclare une variable locale dans le corps d'une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type function_1{
    int a;
     
    type    fonction_incluse{
     
                                                  }
     
    }
     
    type function_2{
     
    }
    la variable a n'est pas locale à function_2 mais est locale à function_1
    Ma question:
    Comme function_incluse est incluse dans fonction_1,la variable locale a a-t-elle sa portée dans function_incluse?

    un prof m'a dit que non mais je souhaite vérifier cette confirmation

    2)Je déclare une variable en non static au début du code en dehors de toutes les fonctions.
    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
     
    int a;
     
    type function_1{
     
     
    type    fonction_incluse{
     
                                                  }
     
    }
     
    type function_2{
     
    }
    La variable a est locale à quelle(s) fonction(s)?
    Est-elle globale?


    merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Tu t'es gouré de forum

    En C, tu ne peux pas faire de fonctions imbriquées.
    En C++, soit tu passes par une lambda (version au moins C++11) soit par des static (<- mais jamais codé)

    Question 1 : si tu peux utiliser une variable locale. C'est le principe de fermeture (closure en anglais, <- lien wiki)
    Question 2 : c'est une variable globale et non locale. Et donc, à la portée près (static vs extern) tu peux l'utiliser partout où elle est accessible.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Définir une fonction incluse n'est pas du tout prévu par la norme. Certains compilateurs peuvent s'y amuser mais personne ne s'en sert car ça n'est pas portable et ne passerait jamais un contrôle de validité logiciel. Donc fonctionnalité à oublier vite.
    Ceci étant dit, il n'y a aucun lien entre une fonction incluse et sa fonction englobante chacune a son contexte local, et aucune des 2 ne voit les variables locales de l'autre. La seule particularité est "seule la fonction englobante peut appeler la fonction incluse, pour toutes les autres elle est inaccessible". Le C++ lui dispose des lambda qui permet a une lambda incluse de voir les variables locales de sa mère.
    Ce qui est autorisé c'est d'avoir une définition d'une structure à l'intérieur d'une définition. Là aussi, il n'y a aucune liaison entre les membres des deux structures. Donc d'intérêt limité mais au moins c'est valide.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    je reprends la question 1) en remplaçant la fonction_incluse par tout type de boucle et de condition utilisant cette variable a

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par tabkelm Voir le message
    je reprends la question 1) en remplaçant la fonction_incluse par tout type de boucle et de condition utilisant cette variable a
    On est dans la même fonction. Les blocs entre accolades voient les variables définies avant, inversement toute variable locale à un bloc disparaît dès la sortie du bloc et est donc invisible des blocs supérieurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int fct() {
       int  var = 1;
       for ( int i = 0 ; i < 3 ; ++i ) {
          ++var;         // voit la variable var du bloc supérieur qui vaudra donc 2, 3 puis 4
          int var = -1;  // défini une autre variable var
          ++var;         // voit à la place la var locale au bloc qui vaudra donc 0, 0 et toujours 0
          printf( "var vaut %d " , var );
       }                   // ici tout ce qui est local au bloc disparaît
       printf( "var vaut %d " , var );       // donc affiche : ..........
    }

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    je me suis trompé au début de la question que je reprends avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class A : toto
    {int a;   //déclaration de variable locale
     
     
     
      type   fonction_membre{
     
                                                           }
     
    } //sortie de classe A
    la variable locale a est-elle locale à fonction_membre?

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    a n'est pas une variable locale, c'est un membre des objets de type A.
    Les fonctions membres ont accès à tous les membres. Donc accèdent à tous les types, toutes les fonctions, toutes les variables, tous les alias de type de la classe A et ceci même s'ils sont private (sauf que les fonctions membres static n'accéderons pas aux variables ni aux fonctions qui ne sont pas static)

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

Discussions similaires

  1. Portée d'une variable dans une boucle FOR ?
    Par Neo41 dans le forum C++
    Réponses: 20
    Dernier message: 17/11/2006, 11h14
  2. [XSLT][XPATH ] Portée d'une variable locale
    Par be_tnt dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/11/2006, 15h39
  3. [XSLT] pb portée d'une variable
    Par NPortmann dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/05/2006, 15h53
  4. Portée d'une variable globale
    Par Giill dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/12/2005, 10h13
  5. [MFC] Globaliser une variable locale
    Par Philippe320 dans le forum MFC
    Réponses: 3
    Dernier message: 01/12/2005, 20h12

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