type liste_var_de_ce_type ;
Identificateurs corrects: | Identificateurs incorrects: |
TAILLE | 8adr |
---|---|
Buffer | |
i | |
adresse_tableau | |
j45 | |
_ptr |
Un identificateur est un suite de lettres et de chiffres commençant par une lettre. Le symbole (caractère souligné) est considéré comme une lettre, on réserve son utilisation en premier caractère pour les variables systèmes.
Le compilateur différencie les lettres minuscules et majuscules.Conventions en usage:
Voir d'autres conseils pour nommer les variables page 105 de ce document.i, j, k, ... pour les indices de boucle
p, q, p1,... pour les identificateurs de pointeurs
s pour une variable de type chaîne de caractères
tmp pour une variable temporaire,...
donnez aux variables un nom mnémonique, supprimez les noms du style style toto1, toto2,... comme les noms trop compliqués à retenir: prmpt qui pourrait vouloir signifier "premier point".
rendre lisibles les identificateurs comprenant plusieurs mots par le caractère "_" ou par une majuscule sur les débuts des mots: premier_point ou premierPoint.
ne vous limitez pas sur le nombre de caractères par identificateur
commentez chaque définition de variable
les variables débutant par le symbole souligné _ sont habituellement réservées au système
Les classes d'allocation:
Où effectuer la déclaration ?
à l'extérieur des fonctions = variables globales et externes
entre la définition d'une fonction et son corps = variables locales
au début d'une instruction composée = variables locales
Les différentes classes de variables:
variables locales (classe auto par défaut)
variables locales (classe register)
variables locales (classe static)
variables globales (classe static par défaut)
variables globales externes et fonctions externes (classe extern)
Variables locales - classe auto par défaut:
int calcul (double x)
{void main (void)}
int i;
while (i > 0)
...
![]()
-------------------------------------------
Visibilité de la variable i
-------------------------------------------
{}
int i ;
int j ;
for (i=1 ;
...
j += i ;
----------------------------------------
Visibilité des variables i et j
----------------------------------------
Variable automatique: (variable temporaire, variable locale)
fait partie de l'environnement local d'une fonction
n'est visible que dans le bloc concerné
allouée dans la pile lors de l'exécution
n'existe que pendant l'exécution du bloc
Variables locales à un bloc - classe auto par défaut:
Il est tout à fait possible de limiter la portée d'une variable locale à un petit groupe d'instructions (appelé alors bloc) - Par exemple :
void main(void){La portée de la variable j est limitée au bloc dans lequel cette variable est déclarée. L'imbrication des blocs permet de déclarer des variables de même nom, seule la variable de niveau le plus profond est alors accessible dans un bloc donné.
int i ;
i = 3 ;
{int j ;}
...
for (j = 0 ; i <= n ; ...
}
Variables locales - classe register:
int calcul (int x)
{
register int i ; |
![]() |
------------------------------------ Visibilité des variables i et j ------------------------------------ |
Les registres étant d'accès beaucoup plus rapide qu'une variable rangée en mémoire centrale, il est avantageux de placer les variables très souvent accédées dans des registres. La requête de l'utilisateur ne pourra cependant être satisfaite que s'il reste des registres disponibles lors de l'exécution du programme.
Toutefois, l'amélioration des performances des optimiseurs de code rend obsolète cette classe de variable.
Variables locales - classe static:
La classe static utilisée dans un bloc permet de stocker
de façon permanente des données à l'usage exclusif
de ce bloc (ici d'une fonction).
La variable ainsi définie n'est ni construite lors de l'appel
de la fonction, ni détruite lors du retour de la fonction.
À chaque appel de la fonction, la variable i retrouve sa valeur
précédente, d'où la nécessité de
l'initialiser lors de sa déclaration par : int i = 0 ;
Il n'existe qu'un seul exemplaire de la variable : faire attention
lors des retours des fonctions (voir slide 79).
int lecture (int a)
{
static int i = 0 ; |
![]() |
------------------------------------------- Visibilité des variables i et j ------------------------------------------- |
Variable locale static:
fait partie de l'environnement local d'une fonction
l'emplacement mémoire est alloué lors de la compilation du programme et demeure inchangé durant son exécution
Variables globales - classe static par défaut:
Variable globale:
int s1 ;
int calcul (int a){void main (void)
if (a > s1)s1++ ;}
return(s1) ;{
...
S1 = 25 ;
...
}-------------------------------------------
Visibilité de
la variable s1
-------------------------------------------
fait partie de l'environnement du fichier, donc de toutes les fonctions définies dans le fichier; toutes les fonctions peuvent modifier cette variable et le buggage devient difficile.
l'emplacement mémoire est alloué lors de la compilation du programme et demeure inchangé durant son exécution.
Variables globales - classe extern:
fichier arbre.c: fichier calcul.c:
int E1 ; void main (void) { |
extern int E1 ; float calcul (int a) { |
Par convention: toutes les variables locales s'écrivent en lettres minuscules, toutes les variables globales commencent par une lettre majuscule.fait partie de l'environnement de chaque fichier qui inclu sa déclaration, toutes les fonctions de ces fichiers peuvent donc modifier cette variable et compliquer le débuggage.
l'emplacement mémoire est alloué lors de la compilation du fichier dans lequel la variable est déclarée (sans extern), les références externes à cette variable dans les autres fichiers sont effectués lors de l'édition de liens.
Fonction externe:
La fonction extern permet de séparer la déclaration du profil d'une fonction de sa définition dans le même fichier ou des fichiers séparés:
extern float calcul (int a) ; | <--- déclaration du profil de la fonction |
void main (void)
-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-x = calcul(y) ;
{
float x ;
int y ;...<--- appel de la fonction
}
float calcul (int a) de la fonction |
<--- définition du code (instructions) |
{
if (a > s1)
...
}
L'initialisation de variables lors de leur déclaration:
initialisation d'une variable permanente (static) par une valeur connue lors de la compilation:
int nb = 0 ;
char c=- 'a' ;
float e = 2.71828 ;
int *adresse = &nb ;
char nom[TAILLE] ;
char adresse_dernier_element = nom + TAILLE - 1 ;
Le compilateur traite les déclarations et les initialisations séquentiellement.
Par exemple, les deux dernière déclarations:
se traduisent par :char nom[TAILLE] ;
char *adresse_dernier_element = nom + TAILLE - 1 ;
L'initialisation des tableaux est présentée page 53réservation d'une zone de TAILLE octets consécutifs,
association du nom symbolique nom à l'adresse de début de la zone mémoire réservée,
réservation d'une zone de 4 octets permettant de stocker une adresse,
association du nom symbolique adresse_dernier_element à l'adresse de cette zone mémoire,
calcul de la constante nom + TAILLE - 1 (qui est bien l'adresse du dernier élément du tableau nom),
stockage de cette valeur dans la variable adresse_dernier_element.
Initialisation d'une variable temporaire:
initialisation effectuée lors de l'allocation mémoire de la variable, lors de chaque appel de la fonction dans laquelle elle est définie
par une expression quelconque (et non par une expression constante)
int calcul (int a)
{int b = 2 * a ;
Les variables non modifiables..
L'attribut const placé devant une déclaration prévient le compilateur que cette variable ne peut pas être modifiée par une instruction du programme.
Une telle variable n'est pas réellement considérée comme une constante, mais plutôt comme une variable non modifiable. Par exemple, on ne peut pu utiliser une telle variable pour dimensionner un tableau :const int n = 10 ;Ce mécanisme peut également être utilisé lors du passage des arguments dans une fonction: la déclaration d'un argument peut être précédée du mot clé const précisant ainsi que ce paramètre, qu'il soit une adresse ou une variable, ne peut pas être modifié par la fonction.
char nom[n] /* incorrect */
Langage C Partie I: Déclaration des variables