langage c - sites personnels de télécom paristech .eric lecolinet - télécom paristech - langage

Download Langage C - Sites personnels de Télécom ParisTech .Eric Lecolinet - Télécom ParisTech - Langage

Post on 12-Sep-2018

215 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Lang

    age

    CEr

    ic L

    ecol

    inet

    Tl

    com

    Par

    isTe

    ch

    Sept

    embr

    e 20

    17

  • Extension du C par Bjarne Stroustrup aux Bell LabsC++11 : rvision majeure en 2011/2014

    Autre extension du C de NeXt puis ApplePuissant, syntaxe inhabituelle inspire de Smalltalk

    Vise la simplicit/rapidit d'criture, cr par G. van RossumInterprt, typage dynamique

    Simplification du C++ de Sun Microsystems puis OracleEgalement inspir de Smalltalk, ADA ...

    A l'origine, le Java de MicrosoftEgalement inspir de Delphi, C++ ...

    Le successeur d'Objective C, par Apple

    Dbut 70 : Langage C

    Dbut 80 : C++

    Dbut 80 : Objective C

    Fin 80... : Python

    Mi-90 : Java

    Dbut 2000: C#

    Mi-2000: Swift

    3

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Aperu

    Un programme C comprend :

    un ou plusieurs fichiers C dfinissant des fonctions (ventuellement)

    des variables globales

    une seule fonction main() = la 1re fonction appele

    une difficult : faire en sorte que les appels et des dfinitions des fonctions correspondent

    4

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    AperuExemple : un programme compos de 2 fichiers

    #include

    void foo(const char* name) {printf("hello %s \n", name);

    }

    int main() {const char* name = "hubert";foo(name);dupondt();

    }_________________________________________________

    // dans un autre fichiervoid dupondt() {

    foo("dupondt");}

    Problme cl : assurer la correspondance entre les appels et les dfinitions des fonctions

    5

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Types de base

    Types de base char : caractre ou petit nombre (1 octet) int : entier (short = 32 bits) bool : boolen (depuis C99, inclure stdbool.h)

    Attention: les tailles varient selon la plate-forme ! cf. limits.h et float.h headers standards (dans: /usr/include sous Linux) example : short = 16 / int = long = 32 / float = 32 / double = 64 bits

    float : flottant simple prcisiondouble : flottant double prcisionlong double : encore plus prcis !

    6

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Types et signe

    signed int unsigned long

    Tous les types sont signs par dfaut sauf char qui dpend de la plate-forme !

    unsigned char : de 0 255

    signed char : de -128 127

    char : sign ou pas sign => source derreurs si on change de plate-forme

    7

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Variables

    Dclarations de variablesint i, res, truc; trois entiersfloat vect[1000]; vecteur de 1000 entiers

    double mat[5][10]; matrice de 5 lignes et 10 colonnes

    ATTENTION : les valeurs sont indfinies => initialiser les variables !int i = 0;char new_line = \n;

    char * p = NULL;

    ne pas confondre = (affectation) avec == (galit) avant C99 : variables dclares avant les instructions (!= Java, C++)

    8

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Constantes

    Types des constantes1234 037 (octal) 0x1f (hexadcimal) 1.234 1. 1e-2 => type double a (caractre) => type int"abcd" (littral) => type char *

    Caractres: a sont des int (et non des char !) en ASCII: A = 65, O (la lettre) = 78, 0 (le chiffre) = 48, \0 (NUL char) = 0

    Littraux: "abcd" sont des chanes de caractres constantes (ne pas modifier leur contenu !) un \0 est automatiquement rajout la fin par le compilateur

    char* message = "hello word";

    Caractres spciaux: \0 = le caractre nul; valeur = 0 \n = new line, \t = tabulation, etc. \xxx = caractre dfini en octal ex : \007 = caractre BELL

    9

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Code ASCII

    10

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Variables constantes, numrations

    Variables valeur constanteconst float pi = 3.14; // cette valeur ne peut pas changer

    Enumrationsenum Jour {LUNDI=1, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE};enum Jour j = JEUDI;

    if (j == SAMEDI) printf("en week end\n")

    commencent 0 par dfaut moyen simple et efficace de spcifier des constantes entires

    11

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Macros

    #define TAILLE 1024#define BELL \007#define MESSAGE "hello word"

    char tableau[TAILLE]; // paramtrer : ne pas crire char tableau[1024] !!!

    substitution textuelle par le prprocesseur C avant la compilation les macros permettent de paramtrer le programme viter les macros si possible : prfrer les numrations ou variables const

    Macros paramtres #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) int i = 1, j = 2; int k = MIN(i, j);

    12

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Oprateurs arithmtiques

    Ordre de priorit - unaire -x * / % + - binaire x-y

    l = i + j * k; // attention la prcdence des oprateurs ! m = (i + j) * k;

    / est la division entire ou relle suivant le cas :

    !!! attention : 2 / 4 vaut 0 mais 2. / 4 vaut 0.5 !!!

    % = reste de la division entire

    13

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Transtypage implicite

    Par dfaut : conversion implicite vers le type le plus grand

    Attention : les conversions implicites peuvent tre dangereuses !int i = 2, j = 4;char c = \n;float x = 4., y1, y2, y3;

    i = c;c = i; x = i;i = x; y1 = i + x;y2 = i / x;y3 = i / j;

    Que vaut y3 ?

    14

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Transtypage implicite

    Par dfaut : conversion implicite vers le type le plus grand

    Attention : les conversions implicites peuvent tre dangereuses !int i = 2, j = 4;char c = \n;float x = 4., y1, y2, y3;

    i = c;c = i; /* entier tronqu */x = i;i = x; /* rel tronqu */y1 = i + x;y2 = i / x;y3 = i / j;

    !!! y3 vaut 0 car i et j sont des int

    15

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Transtypage explicite

    L'oprateur de cast fait une conversion de type explicite

    int i = 2, j = 4; float y, z;

    y = i / j; // y = ? z = (float) i / j; // z = ?

    16

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Transtypage explicite

    L'oprateur de cast fait une conversion de type explicite

    int i = 2, j = 4; float y, z;

    y = i / j; // y = 0.0 z = (float) i / j; // Z = 0.5

    17

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Transtypage explicite

    L'oprateur de cast fait une conversion de type explicite

    !!! Attention : ne convertit pas les donnes ! (seulement le type)

    (Mauvais) exemple : transformer une chane en nombre (et inversement) char * s = "33"; int i = 12;

    s = (char*) i; // compile mais faux !!! i = (int) s; // compile mais faux !!!

    18

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Incrmentation

    Oprateurs i++ et ++i signifient: i = i + 1 i += n signifie: i = i + n mme chose avec: i--, --i, i -= n

    i++ versus ++ii = 5; a = ++i; /* i = ? , a = ? */i = 5; a = i++; /* i = ? , a = ? */

    19

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Incrmentation

    Oprateurs i++ et ++i signifient: i = i + 1 i += n signifie: i = i + n mme chose avec: i--, --i, i -= n

    i++ versus ++ii = 5; a = ++i; /* i = 6 , a = 6 */i = 5; a = i++; /* i = 6 , a = 5 */

    Attention aux ambiguts ! un seul ++ ou -- par ligne!

    20

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Oprateurs logiques et relationnels

    Ordre de priorit! (ngation unaire)> >= <

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Manipulation de bits

    Oprateurs& ET | OU inclusif^ OU exclusif> dcalage droite~ complment un

    int n = 0xff, m = 0; m = n & 0x10; m = n

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    Tests et boucles

    Expressions conditionnelles ne pas oublier les ( ) autour du test ; la fin des deux instructions else optionnel

    if (a > b) z = a; else z = b;

    if (k < tabsize && tab[k] != 0) doit(tab[k]);

    Rappel : arrt de lvaluation ds que : condition fausse pour && condition vraie pour | |

    if (test) action1; else action2;

    if (test) action1;else action2;

    if (test) action1;

    25

    Eric Lecolinet - Tlcom ParisTech - Langage C

    Actions imbriques

    if (n > 0) if (a > b) z = a; else z = b;

    le else se rapporte au if le plus proche mettre des { } pour viter les ambiguts

    !!! indenter le code !!! => utiliser un diteur de texte appropri

    if (n > 0) { if (a > b) z = a; else z = b; }

    if (n > 0) { if (a > b) z = a; } else z = b;

    26

  • Eric Lecolinet - Tlcom ParisTech - Langage C

    else if cascads

    if (test1) action1; else if (test2) action2 ; else if (test3) action3 ; else action_par_dfaut;

    structure de tests en "rateau" ne pas mettre des { } inutiles alternative: le switch

    27

    Eric Lecolinet - Tlcom ParisTech - Langage C

    switch

    if (test1) action1; else if (test2) action2 ; else if (test3) action3 ; else action_par_dfaut;

    switch (expression) { case co

Recommended

View more >