Représenter des valeurs avec des variables

Une variable nomme un objet qui contient une valeur d’un type donné. Le type détermine notamment les valeurs représentables et les opérations possibles. Choisissez des noms descriptifs et une convention cohérente, par exemple nombre_mesures. Un nom ne commence pas par un chiffre ; C distingue majuscules et minuscules.

Déclaration, initialisation et affectation

int compteur = 0; déclare une variable et l’initialise. Une instruction ultérieure compteur = 3; lui affecte une nouvelle valeur. Une déclaration locale int compteur; seule ne lui donne pas une valeur utilisable : n’en lisez pas le contenu avant de lui avoir affecté une valeur.

Fichier : variables.c

#include <stdio.h>

int main(void)
{
    int age = 25;
    unsigned int nombre_mesures = 0;
    float kilometres_marches = 2.5f;
    double temperature = 23.75;
    char initiale = 'A';

    age = 26;
    nombre_mesures = 4;
    printf("Age : %d\n", age);
    printf("Mesures : %u\n", nombre_mesures);
    printf("Distance : %.2f km\n", kilometres_marches);
    printf("Temperature : %.2f degres C\n", temperature);
    printf("Initiale : %c\n", initiale);
    return 0;
}

Les types à connaître

  • int représente des entiers signés dans une plage limitée. Sa taille exacte dépend de l’implémentation.
  • unsigned int représente zéro et des entiers positifs. Il occupe autant de mémoire que int, avec une plage différente. Ce n’est pas un moyen automatique d’économiser de la mémoire.
  • float et double représentent des nombres flottants approximatifs. Sur les plateformes courantes, on rencontre environ 6 et 15 chiffres décimaux significatifs, respectivement ; ce ne sont pas des nombres de chiffres après la virgule garantis partout.
  • char contient une unité de caractère. 'A' est un caractère ; "A" est une chaîne, terminée en mémoire par un caractère nul.

Le suffixe f de 2.5f crée une constante de type float. Dans printf, le float est promu en double, d’où le format %f pour les deux. %.2f arrondit l’affichage à deux décimales ; cela ne change pas la précision de la valeur stockée.

Observer son environnement

Fichier : limites_types.c

#include <stdio.h>
#include <limits.h>
#include <float.h>

int main(void)
{
    printf("int : %zu octets, de %d a %d\n", sizeof(int), INT_MIN, INT_MAX);
    printf("unsigned int : %zu octets, de 0 a %u\n",
           sizeof(unsigned int), UINT_MAX);
    printf("float : %d chiffres significatifs garantis par FLT_DIG\n", FLT_DIG);
    printf("double : %d chiffres significatifs garantis par DBL_DIG\n", DBL_DIG);
    return 0;
}

sizeof mesure une taille en octets C et son résultat s’affiche avec %zu. Un octet C contient CHAR_BIT bits, généralement 8. Les en-têtes limits.h et float.h décrivent les limites de l’implémentation. Les types de largeur exacte de stdint.h, comme uint32_t lorsqu’ils existent, seront utiles plus tard en embarqué.

Portée et durée de vie

Une variable déclarée dans un bloc est visible à partir de sa déclaration jusqu’à la fin de ce bloc, sauf masquage par une autre déclaration. Une variable locale ordinaire existe pendant l’exécution de son bloc. Une variable déclarée au niveau du fichier a une portée de fichier et une durée de vie statique ; cela ne signifie pas que tous les autres fichiers peuvent automatiquement utiliser son nom. La liaison, extern et static seront étudiés avec les programmes multi-fichiers.

Lire une saisie : les précautions nécessaires

scanf peut convertir du texte et stocker un résultat dans une variable, mais son retour doit être vérifié. Une conversion numérique peut échouer et laisser des caractères non consommés. Une conversion hors de la plage du type n’est pas rendue sûre par le seul contrôle du retour.

N’utilisez pas scanf("%s", prenom) sans limite : un texte trop long peut déborder du tableau. Pour un tableau de 30 caractères, %29s borne un mot, mais ne gère pas à lui seul les espaces et le reste d’une ligne trop longue. Nous commencerons par fgets dans la leçon sur les conditions, puis une conversion contrôlée dans le projet final.

Exercice

Dans le premier programme, remplacez la distance par 3.25f, ajoutez une variable int jours = 2; et affichez-la avec %d. Prévoyez le résultat avant l’exécution. Expliquez ensuite pourquoi afficher deux décimales n’ajoute pas de précision au calcul.