2. variables et types simples©cial:pages... · 2014. 9. 1. · types et variables • tout objet...

27
2. Variables et types simples Déclarations de variables Types scalaires Conversions de types Tableau Espaces de visibilité et classes d’allocation 1

Upload: others

Post on 29-Jan-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

  • 2. Variables et types simples • Déclarations de variables • Types scalaires • Conversions de types • Tableau • Espaces de visibilité et classes d’allocation

    1

  • Types et variables

    • Tout objet doit être déclaré avant d’être utilisé

    • Déclaration associe un type à un identificateur

    • En C, on dispose des types : •  fondamentaux : int , float , char , void •  composés : tableau, structure, énumération •  pointeurs

    2

  • Variables scalaires • Entiers

    •  déclaration : int i;

    int resultat ; ou int i, resultat; •  taille varie selon les machines (2, ou 4 octets (linux)), entier signé par défaut •  Variable non initialisée: contient une valeur aléatoire.

    •  déclaration avec initialisation : (facultative) int i=3; int j=3, resultat=2;

    •  Initialisation a posteriori :

    i=3; resultat=4;

    3

  • Variables scalaires •  qualificatifs : short, long, unsigned, signed

    exemples : short j; idem short int j ; (int facultatif) unsigned u = 2;

    4

    Type Octets (linux)

    Format (printf) Valeurs admisses

    short,signed short 2 %hi -32 768 … 32 767 unsigned short 2 %hu 0 … 65535

    unsigned 4 %u 0 … 4 294 967 295 signed 4 %i, %d -2 147 483 648 … 2 147 483 647

    unsigned long 4 %lu 0 … 4 294 967 295 long 4 %li, %ld -2 147 483 648 … 2 147 483 647

    long long 8 %lli, %lld -9.22E+8 … 9.22E+18

  • Variables scalaires • Réels (à virgule)

    •  déclaration : float i; float resultat ;

    float i, resultat; •  précision :

    •  initialisation : (facultative) float i=3.2;

    double resultat= 3.4e-2 ;

    ou float i; i=0.4e-1;

    5

    Type Octets (linux) Format (printf) float 4 (mantisse+exposant) %f, %e double 8 (mantisse+exposant) %lf, %le

  • Variables scalaires • Caractères

    •  codé sur 1 octet d’après le code ASCII standard ( 0 – 127)

    •  déclaration : char c , d , e ; •  qualificateur :

    •  unsigned char f ;

    Ø Si 1 char est utilisé pour un usage autre que stocker un caractère imprimable: préciser signed ou unsigned.

    6

    Type Octets (Linux)

    Format (printf)

    Valeurs admissibles dans le calcul avec 1 entier

    unsigned char 1 %c , %hhu, %u 0 … 255 signed char 1 %c, %hhi, %i -128 …127

    char 1 %c ? signé ou non, dépend machine Mais caractère du code ascii standard

    positif (0-127)

  • Variables scalaires •  Initialisation : c = ’A’ ; idem que char c = 65;

    char line = ’\n’;

    c = ’A’;

    d = 66 ;

    e = c + 5 ;

    • Caractères particuliers

    •  \n (retour à la ligne, code ascii =9 )

    •  \t (tabulation, code ascii = 10(10))

    7

    c d e

    65 66 70

  • Conversion de types 8

      Conversions implicites (en l’absence d’unsigned) :

    •  Lors d’une opération à 2 opérandes (+, -, *, / ) : « le type le + petit est promu dans le type du plus grand »

    •  Exemple: float a, b=3.2;

    int c=2;

    a=b+c;

    (a=3.2+ 2.0) -> a=5.2

    double float

    long int int

    char short Pr

    omot

    ion

    Conversion implicite en float

  • Conversion de types 9

      Conversions implicites :

    •  Lors d’une affectation (a = b) : « le type de b est converti dans le type du résultat a »

    •  Exemple 1: float b=3.2;

    int a=3, c=2; b=c+a; c=b+a;

    (b=5.0) (c=6)

    Conversion implicite en float

    =5, int =6.2, float (1.implicite conversion de a)

    2.conversion implicite en int (troncature de la partie fractionnaire )

  • Conversion de types 10

      Conversions implicites :

    •  Lors d’une affectation (a = b) : « le type de b est converti dans le type du résultat a »

    •  Exemple 2 : short b=0x010B; (utilise 2 octets)

    char c=0x02; b=c; c=b;

    (b=0x0002) (c=0x0B)

    Conversion implicite en short

    Conversion implicite en

    char(troncature des bits de poids fort)

  •   Conversions explicite : operateur de cast (type) •  L’utilisateur peut forcer la conversion d’une variable dans un

    autre

    •  Exemple 1: float f; int k=3, j=2;

    f=k/j; f=(float)k/j;

    (f=1.0) (f=1.5)

    Idem f=(float)(k/j); Idem (float)k/(float)j

    Conversion implicite en float =1.5, float

    =1, division entière k float (-> implicite conversion de j en float)

    Conversion de types 11

  • Void • Type introduit tardivement, utilisé pour :

    •  Indiquer qu’une fonction ne renvoie pas de valeur void function (int x, int y)

    •  Un pointeur générique, ne pointe sur aucun type en particulier: void* (à voir plus tard)

    12

  • Définitions et déclarations

    Un tableau est une collection d'éléments de même type, stockés de façon contiguë en mémoire.

    • Déclaration : < type nom [taille] > Exemples : int tab[5] ; char ligne[80] ;

    • Chaque élément est repéré par un indice

    13

    tab[0] tab[1] tab[2] tab[3] tab[4]

  • Accès aux composants

    •  int t[5] ;

    •  t[0] = 23 ;

    •  t[3] = t[0] + 4 ;

    •  t[2] = t[3] + t[0] ;

    14

    t[0] t[1] t[2] t[3] t[4]

    t[0] t[1] t[2] t[3] t[4]

    t[0] t[1] t[2] t[3] t[4]

    t[0] t[1] t[2] t[3] t[4]

    23

    23 27

    23 50 27

  • Initialisations

    •  int t[4] = {12,34,56,78};

    •  int t[4] = {1,2};

    •  int t[3] = {21,43,65,87};

    •  int t[] = {3,2,1} ;

    15

    t[0] t[1] t[2] t[3] 12 34 56 78

    t[0] t[1] t[2] t[3] 1 2

    t[0] t[1] t[2] 21 43 65

    t[0] t[1] t[2] 3 2 1

  • Chaînes de caractères •  tableau de caractères se termine par ' \0 ’ (backlash 0) •  avec initialisation : char tab[80] = "hello!";

    idem char tab[80] ={’h’,’e’,’l’,’l’,’o’,’!’,’\0’};

    •  tableau assez grand pour contenir les caractères de la chaîne + le delimiteur de fin \0

    •  accès identiques aux tableaux : tab[4]=’o’;

    •  constantes chaînes entre guillemets : "bonjour"

    16

  • Chaînes de caractères char str1[6] = "hello" ; printf("1: %s ? \n" , str1); scanf( "%s",str1); ou pour lire au plus 5 caractères: scanf ("%5s",str1); printf("Hello %s !\n" , str1);

    17

    h e l l o \0 str1

    A l’écran: hello ? loic c ↵ Hello loic ! Note: scanf("%s", ) stoppe la lecture au premier

    espace blanc

  • Chaînes de caractères •  fonctions de manipulation dans les bibliothèques standards :

    •  strlen : calcul la longueur d’une chaîne •  strcomp : compare 2 chaînes •  strstr: recherche une chaîne de caractère à l’intérieur d’une

    autre chaîne

    18

  • Espace de validité et classe d’allocation Variable locale

    •  définie à l’intérieur d’un bloc (fonction ou sous-bloc) •  connue et accessible, valide à l’intérieur de ce bloc uniquement

    • Classe automatique (par défaut) •  allouer dynamiquement à l’exécution du bloc et libérée à la fin du bloc •  contenu est perdu entre deux exécutions •  allocation se fait sur une pile de travail •  il faut les initialiser avant de les utiliser

    •  classe par défaut , donc auto int j ; équivalent à int j ;

    19

  • Espace de validité et classe d’allocation Variable locale #include

    void main()

    {

    int i=1;

    { int k=2;

    printf(”> %d %d\n",i,k);

    }

    }

    20

    Compilation: OK Sortie écran : > 1 2

  • Espace de validité et classe d’allocation Variable locale #include

    void main()

    {

    int i=1;

    { int k=2;

    }

    printf(”> %d %d\n",i,k);

    }

    21

    Compilation: Erreur ! In function ‘main’: 10: error: ‘k’ undeclared

  • Espace de validité et classe d’allocation Variable locale #include

    void main()

    {

    int i=1;

    { int i=2;

    printf(”> %d\n",i);

    }

    }

    22

    Compilation: OK Sortie écran: > 2 Note: le i le plus local est utilisé. Mais mauvaise idée ! èUtiliser des noms différents

  • Espace de validité et classe d’allocation Variable locale

    • Classe statique •  allocation permanente pas détruite lors de la sortie de la fonction (bloc)

    valeur conservée entre 2 appels

    •  mais visibilité toujours limité au bloc, inaccessible hors du bloc

    •  static int i ; static float f ;

    23

  • Espace de validité et classe d’allocation #include void plus() { int i , j = 1 ; static int k = 1; j = j + 1; k = k + 1; printf(’’i=%d j=%d k=%d\n’’, i,j,k); } int main() { plus(); plus(); plus(); return(0); }

    24

    Sortie écran: i=0 j=2 k=2 i=0 j=2 k=3 i=0 j=2 k=4 Note : i pas initialisé Hasard, si i=0.

  • Espace de validité et classe d’allocation

    25

    Variables globales

    –  définies hors du corps d’une fonction –  connues et accessibles tout au long du programme (globalement visibles par n’importe quelle fonction) –  permettent de partager l’information entre toutes les fonctions

    int i;

    { int j ; … } { int k ; … }

    Global variable

    Fichier source

    Ne pas abuser des variables globales: -garder local ce qui est local, pour avoir des fonctions réutilisables (bibliothèque))

  • Espace de validité et classe d’allocation

    26

    int j; /* GLOBAL VARIABLE*/ void plus() { int i = 1 ; static int k = 1; j = j + 1; k = k + 1; printf("i=%d j=%d k=%d \n", i,j,k); i= i+1; } void main() { j=6; plus(); plus(); plus(); }

    Sortie écran: i = 1 j = 7 k = 2 i = 1 j = 8 k = 3 i = 1 j = 9 k = 4

  • Espace de validité et classe d’allocation

    27

    Variables globales pour un programme sur plusieurs fichiers

    –  Définition : réserve de la place mémoire –  Allusion : représente les propriétés (déclaration) extern

    –  Classe statique pour une variable globale: portée, visibilité, de la variable globale limitée au fichier

    Fichier b

    int i;

    fonction 1 fonction 2

    extern int i; static int j;

    fonction 3

    Fichier a

    définition allusion