Introduction
Nous avons vu que l'on pouvait déclarer des identificateurs de variables ou de paramètres formels en différents endroits du code. La question qui se pose est : « est-ce qu'un identificateur déclaré à un endroit du code peut être utilisée à un autre ? »
Cette question est importante en particulier quand une fonction appelle elle-même une fonction.
Nous introduisons un ensemble de notations qui permettent de mieux comprendre le déroulement d'un programme.
A tout identificateur, nous attribuons un quadruplet qui définit son état (visible, nature, type, valeur) :
Ce quadruplet prend différentes valeurs tout au long du déroulement du programme, ce qui permet de tracer et suivre l'état d'un identificateur à différents points d'observation au sein du code.
NB : par la suite {} signifiera ensemble vide, ou rien, ou aucune valeur.
Le premier élément "Visible" prend ses valeurs dans l'ensemble {V, NV} :
-
"V" signifie "visible" : en un point d'observation précis du code pendant son fonctionnement, si l'on essaie d'insérer un "printf" qui affiche le contenu de cet identificateur alors le compilateur "connaîtra" cet identificateur et acceptera de compiler l'appel de "printf" avec cet identificateur comme argument ;
-
NV" signifie "non visible" : au point d'insertion du "printf" dans code, le compilateur refusera de compiler, il génèrera une erreur de compilation car l'identificateur ne sera pas connu.
Le deuxième élément "Nature" prend ses valeurs dans { {}, VG, VL de quoi, PF de quoi, PR de quoi}
-
"{}" signifie que l'identificateur n'a pas de nature, cela ne peut être qu'un identificateur non visible
-
"VG" signifie variable globale, elle est a priori connue en tout point du code après sa définition, le code est vu comme le "bloc" principal, qui englobe tous les autres blocs
-
"VL de quoi" signifie que l'identificateur est celui d'une variable locale et il FAUT OBLIGATOIREMENT préciser à quel bloc ou fonction cet identificateur est local. Dans ce cas, l'identificateur est connu UNIQUEMENT au sein du bloc où se trouve sa déclaration ET dans tous les blocs ou appels de fonctions inclus dans le bloc où se trouve sa déclaration. Cependant, si un identificateur est défini dans un bloc qui utilise une fonction alors cet identificateur ne sera pas visible dans la fonction.
-
"PF de quoi" signifie identificateur de paramètre formel. Ce type d'identificateur ne peut se trouver qu'au niveau de la déclaration d'une fonction, c'est-à-dire dans l'en-tête de la fonction et dans le bloc de la fonction :
-
-
dans l'en-tête de la fonction : l'identificateur donne formellement un nom à une information, une donnée qu'il faudra transmettre pour pouvoir utiliser la fonction. Il permet de donner un identificateur à une donnée dont on ne connaît pas encore la valeur, c'est donc un identificateur "formel"
-
-
-
dans le bloc de la fonction : l'identificateur est utilisable dans des instructions et expressions au sein du bloc de la fonction. Il faut donc préciser "de quoi", c'est à dire à quelle fonction correspond le paramètre formel.
-
-
"PR de quoi" signifie identificateur de paramètre réel. Au niveau de l'utilisation d'une fonction, c'est soit la valeur du littéral, soit la valeur de la variable, soit la valeur de l'expression, soit la valeur d'un paramètre formel (cas d'une fonction qui en appelle une autre) qui sera recopiée dans le PF associé en respectant l'ordre de la déclaration de l'en-tête de la fonction.
Le troisième élément "Type" prend ses valeurs dans { {}, type simple, constructeur de type, type défini par le programmeur}. A ce stade seul "{}" et "type simple" ont été vus dans ce cours, les autres points seront vus dans les chapitre suivants :
-
"{}" signifie que l'identificateur n'a pas de type, cela ne peut être qu'un identificateur non visible
-
"type simple" : exemple : int, float, double, char, etc.
-
"constructeur de type", "type défini par le programmeur" : attendre le cours sur struct et typedef pour revenir sur cette partie
Le quatrième élément "Valeur" : prend ses valeurs dans { {}, < contenu du réceptacle associé à l'identificateur > }
-
"{}" signifie que l'identificateur n'a pas de valeur, soit l'identificateur est non visible, soit la variable n'a pas été initialisée, dans ce dernier cas, on ne sait pas ce qu'elle contient, ce que l'on assimilera à "{}" pour simplifier
-
"contenu du réceptacle associé à l'identificateur" au point d'observation de l'identificateur, c'est la valeur qu'il a, c'est au programmeur (vous) de savoir exactement quelle est cette valeur en ce point précis du code.