Cours 8.5. Portée des variables

Définition

La portée d'une variable (scope en anglais) correspond à la partie du code pendant laquelle cette variable peut être utilisée. On distingue 3 types de variables :

La portée d'une variable correspond aussi à la zone du code où la mémoire est allouée (réservée) pour cette variable :

Pour limiter l'empreinte du programme sur l'utilisation de la mémoire, on essaie toujours de réduire la portée des variables afin d'utiliser le moins d'espace mémoire possible.

Exemple

Analysons l'exemple suivant :

void fct(void);

int main(void) {
  int i=5;
  fct ();
  return 0;
}

void fct(void) {
  printf ("%d\n", i);
}

La variable i est définie dans la fonction main(), sa portée est limitée au programme principal. On dit que i est une variable locale. Elle ne peut pas être utilisée en dehors du main(). Par conséquent, elle ne peut pas être utilisée dans la fonction fct(). Lors de la compilation, l'erreur suivante apparaît :

main.c:14:17: error: use of undeclared identifier 'i'
  printf ("%d", i);
                ^
1 error generated.
compiler exit status 1

Cette erreur indique que la variable i n'est pas déclarée dans la fonction, puisqu'elle est locale au programme principal.

Exercices

Exercice 1

Corriger l'exemple ci-dessus en ajoutant un argument à la fonction fct() pour que le programme compile sans erreur. Tester le programme :

Exercice 2

Écrire une fonction void incremente(int n); qui reçoit en paramètre un entier n et qui exécute la ligne suivante : n=n+1;. Testez votre fonction avec le programme principal suivant :

int main(void) {
  int n=3;
  printf ("Avant, n=%d\n", n);
  incremente(n);
  printf ("Après, n=%d\n", n);
  return 0;
}

Exercice 3

Écrire une fonction int incremente(int n); qui reçoit en paramètre un entier n et qui retourne n+1. Testez votre fonction avec le programme principal suivant :

int main(void) {
  int n=3;
  printf ("Avant, n=%d\n", n);
  incremente(n);
  printf ("Hum... n=%d\n", n);
  n = incremente(n);
  printf ("Après, n=%d\n", n);
  return 0;
}

Quiz

En programmation, la portée d'une variable ...

Vérifier Bravo ! La portée est la zone du programme où la variable peut être utilisée et évidemment la mémoire y est aussi allouée. Essaie encore ...

Considérons la fonction suivante :

void fct(int i);
Vérifier Bravo ! Les arguments des fonctions sont aussi des variables locales à la fonction. Essaie encore ...

La portée des variables ...

Vérifier Bravo ! L'espace mémoire augmente avec la portée des variables. Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
void fct(n);

int main(void) {
  int n=7;
  fct(n);
  printf ("n = %d",n);
  return 0;  
}

void fct(n) {
  n=n-1;
}
Vérifier Bravo ! Il y a deux variables distinctes nommées n. Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
void fct(void);

int main(void) {
  int n=7;
  fct();
  printf ("n = %d",n);
  return 0;
}

void fct(void) {
  n=n-1;
}
Vérifier Bravo ! La variable n est locale à la fonction main() et inconnue dans la fonction fct(). Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
int fct(int n);

int main(void) {
  int n=7;
  fct(n);
  printf ("n = %d",n);
  return 0;
}

int fct(int n) {
  return n-1;
}
Vérifier Bravo ! La valeur est retournée par la fonction fct(), mais elle est inutilisée par le programme principal. Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
int fct(int n);

int main(void) {
  int n=7;
  n=fct(n);
  printf ("n = %d",n);
  return 0;
}

int fct(int n) {
  return n-1;
}
Vérifier Bravo ! La valeur est retournée par la fonction fct() et exploitée dans le programme principal. Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
int fct(int n);

int main(void) {
  int x=7;
  x=fct(x);
  printf ("x = %d",x);
  return 0;
}

int fct(int n) {
  return n-1;
}
Vérifier Bravo ! La valeur de n est copiée dans x quand le mot-clé return est exécuté. Essaie encore ...

Qu'affiche le programme suivant :

#include <stdio.h>
int fct(int n);

int main(void) {
  int n;
  fct(n);
  printf ("n = %d",n);
  return 0;
}

int fct(int n) {
  return n-1;
}
vérifier Bravo ! Il y a deux variables distinctes nommées n. La variable du main() n'est pas affectée. Essaie encore ...

Voir aussi


Dernière mise à jour : 16/11/2023