# Introduction au langage C/Variables et constantes
## Introduction à la notion de variables

Les variables sont au cœur de la programmation. Une variable peut associer un nom à une valeur. Il ne faut en aucun cas confondre le nom et la valeur. La variable n’est pas constante, elle peut varier pendant l'exécution du programme. Une variable peut associer un nom de variable à une chaîne de caractères alphabétique, ou à un booléen, c'est-à-dire vrai ou faux.

## Variables et programme
### Déclaration de la variable dans le programme

Pour déclarer une variable dans un programme, il faut écrire par exemple :
* Le type de la variable (int)
* son nom (var1, par exemple)
* initialisation = (valeur de départ) facultatif mais recommandé.
Un exemple :
Ce code aura pour fonction d'associer à la variable var1 de type int la valeur 3.
Conseil de codage à respecter : c_lis_16.

### Syntaxe correcte pour le nom des variables

* Il est déconseillé d’utiliser le symbole _, son utilisation est réservée aux identificateurs de constantes et à la programmation système (programmation en mode noyau).
* Tous les identifiants sont sensibles à la casse, c'est-à-dire que les minuscules et les majuscules ont leur importance.
| Identificateurs corrects | Identificateurs incorrects | Pourquoi ? |
| nom1 | 1nom | Ne peut commencer par un chiffre |
| nom_2 | nom.2 | Les points ne sont pas autorisés |
| _nom_3 | -nom-3 | Les tirets ne sont pas autorisés |
| nom_de_variable | Nom de variable | Les espaces ne sont pas autorisés |
| deuxieme_choix | deuxième_choix | Les caractères accentués ne sont pas autorisés |
| mot_francais | mot_français | Les cédilles ne sont pas autorisées |
Conseils de codage à respecter : c_lis_8, c_lis_9, c_rec_1.

### Afficher une variable

Pour afficher une variable à l'écran ou l'écrire dans un fichier, il faut appeler une fonction des fonctions de sortie dont le prototype est dans stdio.h, comme par exemple printf.
Par exemple, pour afficher un entier, il faut appeler la fonction
Ce qui donne en programme complet :
Remarques
* printf est une fonction à nombre de paramètres variable : son premier paramètre obligatoire est une chaîne décrivant le format de la sortie, les suivants sont des variables qui remplaceront les indicateur de conversion % de la chaine de conversion.
* Pour afficher une variable flottante, il faut écrire :
* les fonctions de la famille de printf retournent en cas de succès le nombre de caractères écrits dans le flux de sortie, et en cas d'erreur une valeur négative. Un programme opérationnel doit tester ce code retour. Ici, pour simplifier nous l'ignorons explicitement par le cast (void).
* Les indicateurs de conversion de la chaine de format de printf doivent correspondre en nombre et type aux variables passées en paramètre sous peine d'erreur à l'exécution.

### Récupérer une variable

Pour lire une variable sur le flux d'entrée stdin (associé par défaut au clavier), il faut faire appel à la fonction scanf("%d", &variable); (%d est remplacé par : %f pour les nombres réel (float), %s pour les chaines de caractères (char * / char), %c pour un caractère, etc. )
Il faut auparavant déclarer la variable à utiliser, puis passer son adresse à la fonction scanf à l'aide de l'opérateur &.
Voilà un code complet :
Dans les prochains chapitres, nous verrons comment additionner des variables, les utiliser dans des boucles ou conditions, etc.
Remarque :
* Les remarques concernant printf s'appliquent à scanf.
* La fonction scanf a besoin de l'adresse de vos variables pour y écrire. Pour cette raison, on utilise le symbole & voir le chapitre 9
* Sans ce passage par adresse, la fonction scanf tenterait d'écrire le nombre lu à l'adresse 0 (contenu de variableEntiere), qui n'appartient pas à votre domaine d'adressage autorisé. Le système enverait alors un signal à votre programme, qui s'arrêtera prématurément.

### Portée et persistance des variables

Des règles définissent la visibilité et la persistance des variables déclarées ou définies (= espace mémoire de stockage réservé). Ces caractéristiques dépendent de l'endroit où elles sont déclarées et de mots réservés (classes de stockage et qualificateurs) placés avant leur type.
Conseil de codage à respecter : c_rec_11

#### Portée

* locale : la variable n'est visible que dans le fichier ou le bloc (espace entre deux accolades de même niveau) où elle est définie.
* globale : la variable est visible dans tout le fichier source, mais aussi dans les autres fichiers sources du projet. Elle est persistante.
* Remarque Qualité : l'usage des variables globales doit être limité, elles peuvent créer des problèmes :
** dits d'effets de bord : elles peuvent être modifiées par erreur par une autre fonction;
** à l'édition de lien : définition multiple d'un symbole.

#### Quelques modificateurs

* extern : déclare une variable globale qui doit être définie ailleurs.
* static : rend une variable persistante et limite sa portée au fichier si elle est définie hors du corps des fonctions.
* register : information pour le compilateur lui demandant de permettre un accès plus rapide de cette variable.
* auto (par défaut) :
** dans le corps d'une fonction : la variable est dite automatique : sa portée est limitée au bloc où elle est définie et aux blocs inclus. Son espace mémoire de stockage n’est pas préservé au dehors.
** En dehors d'une fonction : c’est une définition de variable globale (avec réservation de mémoire).

#### Localisation

Les variables peuvent se définir :
* À l'extérieur du corps des fonctions
** sans modificateur de portée : définition = réservation de mémoire d'une variable globale
** avec static : portée limitée au fichier courant, variable persistante.
* En tête d'un bloc (limité par deux accolades de même niveau)
** sans modificateur : variable automatique, portée locale.
** avec static : variable persistante, portée locale.

## Les constantes
### Introduction

Les constantes sont proches des variables, à un point près : Elles ne peuvent pas changer de valeur au cours du programme.

### Les constantes littérales

Les constantes littérales représentent des valeurs numériques ou caractères entrés dans le code source du programme et réservés et initialisés lors de la phase de compilation de code source.
Exemple d'écriture des constantes littérales numériques :
* 6 : la constante entière 6 codée sur un entier avec signe.
* 6u ou 6U : la constante entière non signée 6.
* 6l ou 6L : la constante entière signée 6 codée sur un entier long.
* 6ul ou 6UL : la constante entière non signée 6 codée sur un entier long.
* 010 : la constante 8 (en base 10) codée 10 (base 8) : Danger.
* 0x12 : la constante hexadécimale 12 (base 16) qui vaut 18 en base 10.
* 5.f : la constante réelle simple précision 5.
* 5. : la constante réelle double précision 5.
* -5.12E-18 : la constante réelle double précision −5,12 × 10$^{-18}$.
* '2' : le caractère alphabétique 2.
* '\10' : le caractère ASCII de code octal 10 = 8 en décimal.
* '\x1A' : le caractère ASCII de code hexadécimal 1A = 26 en décimal.
* '\n' : le caractère correspondant à la séquence d'échappement \n qui représente un saut de ligne.
* "Bonjour Aude" : représente une zone mémoire de 13 caractères (12+1) allouée lors de la compilation et initialisée avec la chaîne de caractère Bonjour Aude à laquelle est ajoutée le caractère de fin de chaine de code ASCII 0 ('\0').

### Les constantes symboliques

Les constantes symboliques sont définies par le programmeur ou pour lui dans des fichiers inclus par exemple stdio.h.

#### Variable déclarée avec le modificateur const

Ce sont des variables dont la valeur n’est pas modifiable, sauf au niveau de leurs déclarations.
Pour déclarer une constante, il faut ajouter le mot réservé const avant son type.

#### Constantes préprocesseur

Avec le commande #define, il est possible de donner un nom symbolique à une constante littérale définies dans les fichiers d'entête ou dans le texte du programme (de préférence au début).
Compilation et résultat :

#### Constante énumérée

L'énumération est une suite de constantes renfermées dans une seule.
Il est possible de donner une valeur entière à ces constantes, si vous ne donnez qu'une seule valeur à une seule constante les suivantes prendront la même valeur incrémentée de 1.
Remarque : Si vous ne donnez aucune valeur, par défaut la première valeur sera zéro.

## TP

| Mots clés | Types |