Você está na página 1de 42

Syntaxe et outils de base du langage C

Grard Dethier Fvrier 2011

Chapitre 1

Introduction
Le but de ce document est de permettre la consultation rapide de la syntaxe C associe des notions de programmation courantes telles que les types, oprateurs, dclarations de fonctions, pointeurs, etc. Il ne constitue pas ncessairement une base dapprentissage pour la programmation et pour le langage C en particulier. Le lecteur souhaitant consulter un document plus complet ce sujet devrait plutt se tourner vers les transparents 1 du cours INFO20091 donn par le Professeur B. Boigelot. La version C99 du langage C est considre dans ce document. Celle-ci est dcrite dans la norme ISO 9899 de 1999. La syntaxe du langage C est dcrite en utilisant le meta-langage EBNF. Ce choix soppose une description base sur des exemples. En effet, les exemples ne permettent gnralement pas de prsenter toutes les possibilits syntaxiques dun langage. Cependant, ils participent souvent la bonne comprhension dune description thorique plus complte. Le document est compos de deux parties. La premire dcrit la syntaxe du langage. La seconde dcrit certains outils de base du C, notamment des fonctions utiles dnies par la librairie standard du C. Le contenu de ces deux parties nest cependant pas exhaustif. Concernant la syntaxe, les constructions les plus rares ont t omises. Enn, les outils dcrits dans la seconde partie ne constituent quune partie de la librairie standard du C.

1.1

Description de la syntaxe

Un langage de programmation peut tre dcrit par une grammaire qui spcie les constructions autorises. Une grammaire est constitue dun ensemble de symboles terminaux, qui reprsentent les jetons de base du langage, ainsi quun ensemble de symboles non terminaux qui reprsentent les sous-constructions autorises du langage. Le langage est dcrit par un symbole non terminal racine . Le meta-langage EBNF (Extended Backus-Naur Form) dcrit dans la norme ISO 14977 de 1996 permet de dcrire la grammaire dun langage de programmation. Dans ce document, nous allons utiliser une version lgrement modie du langage EBNF pour dcrire la syntaxe du langage C. Une rgle de production dcrit une construction autorise associe un symbole non terminal. Celle-ci est dcrite par la notation X ::= a o X est un identicateur de symbole non terminal et a la description EBNF dune construction autorise faisant intervenir des symboles terminaux et non terminaux ainsi que les oprateurs dcrits par le langage EBNF.
1. http://www.montefiore.ulg.ac.be/~boigelot/cours/info/slides/info-2009.pdf

Les oprateurs du langage EBNF sont les suivants (a, b sont des descriptions EBNF de constructions possibles) : (a) : permet de dlimiter une expression EBNF laquelle un oprateur peut sappliquer. a* : reprsente la rptition dune construction reprsente par a un nombre n de fois avec n 0. a+ : reprsente la rptition dune construction reprsente par a un nombre n de fois avec n 1. a | b : reprsente soit une construction dcrite par a, soit une construction dcrite par b. [ a ] : la construction dcrite par a est optionnelle (elle peut apparatre 0 ou 1 fois). Les symboles terminaux sont reprsents en utilisant une typographie particulire : par exemple, a est un symbole terminal. Voici un exemple simple de grammaire EBNF dcrivant une somme dentiers contenant au moins un terme :

somme ::= entier (+ entier)* entier ::= [-]chiffre+ chiffre ::= 0 | . . . | 9

La construction suivante est valide : 42 + 666 + -1.

1.2

Utilisation du document

La lecture du document dans son entiret permettra au lecteur davoir une vue densemble des possibilits de base du langage C. Pour consulter la syntaxe lie un concept de programmation, la consultation de la table des matires devrait permettre de trouver la section approprie. Un index reprenant les mots-cl du langage C, les symboles non terminaux importants utiliss dans la description syntaxique du langage C ainsi que les fonctions et directives dcrites dans la deuxime partie est fourni. Cet index permet de facilement retrouver la syntaxe et/ou la dnition lie un mot-cl, un symbole non terminal, une fonction prdnie ou une directive.

1.3

Description gnrale dun programme C

Un programme C est essentiellement constitu dun ensemble de dnitions et dclarations de types (voir Section 2.3), variables globales et constantes (voir Section 2.4), et fonctions (voir Chapitre 3). Les variables globales peuvent tre modies par les fonctions du programme. Le comportement dune fonction (donn lors de sa dnition) est dcrit par une squence dinstructions (voir Chapitre 5) et de dnitions de types, constantes et variables locales. Un identicateur (de variable, constante, fonction, type ; voir Section 2.1) doit toujours avoir t dclar avant de pouvoir tre utilis. On peut noter que dans le cas des fonctions et des types, dclaration ne signie pas dnition : on peut dclarer une fonction sans pour autant donner son comportement ; de mme, on peut dclarer un type sans en dnir la structure. Cette possibilit est particulirement intressante en cas de rfrences croises : une fonction f fait appel, dans son comportement, la fonction g qui, dans son comportement, fait aussi appel la fonction 2

f. Une solution est de dclarer les 2 fonctions puis de les dnir la suite de ces dclarations. Le mme problme peut se poser lors de la dclaration dun type et la mme solution peut tre apporte ce problme. Lors de linvocation du programme, une fonction particulire est appele : cest la fonction main (voir Section 3.2). Le comportement de cette fonction donne donc les instructions qui seront excutes lors de lappel du programme. Le comportement de la fonction main contient gnralement des appels vers les fonctions auxiliaires du programme. Le langage C propose une librairie (cest--dire une ensemble de fonctions) standard qui implmente des oprations courantes ou contient des dclarations de constantes et de types dutilit gnrale (voir chapitres 6, 7, 8 et 9).

Premire partie

Syntaxe

Chapitre 2

lments de base
2.1 identicateurs et constantes

Un identicateur (id) peut tre utilis pour nommer une variable (voir sections 2.4 et 3.1), une fonction (voir Chapitre 3) ou un type (voir Section 2.3).

id ::= letter(letter|digit)* letter ::= a | . . . | z | A | . . . | Z | _ digit ::= 0 | . . . | 9

Une constante (cst) peut tre un entier, un nombre rel, un caractre, une chane de caractre, un tableau ou une structure. Une constante peut tre utilise pour initialiser une variable (voir sections 2.4 et 3.1) ou intervenir dans une expression (voir Chapitre 4).

cst ::= cst-entier | cst-reel | cst-car | cst-chaine | cst-array | cst-struct | cst-expr cst-entier ::= [-](digit)+[l | L | ll | LL | u | U] cst-reel ::= [-](digit)*.(digit)* [Ecst-entier][f | F | l | L] cst-car ::= car cst-chaine ::= "(car)*" cst-array ::= { [ cst (, cst)*] } cst-struct ::= { [ id : cst (, id : cst)* ] } car ::= Un symbole ASCII cst-expr ::= cst-entier | cst-reel | cst-car | ( cst-expr ) | cst-expr bin-op cst-expr | un-op cst-expr bin-op ::= bin-arith-op | bin-logic-op | bin-comp-op un-op ::= un-arith-op | un-logic-op

Pour faciliter leur description, les symboles id, cst-entier, cst-reel, cst-car et cst-chaine sont reprsents ici comme des symboles non terminaux. En ralit, ils constituent des jetons du langage C et devraient 5

donc tre considrs comme des symboles terminaux. En pratique, cela signie que les identicateurs et constantes entires, relles et de type caractre ne peuvent pas contenir de sparateurs cest--dire des espaces, des tabulations ou des retours la ligne. Pour les constantes entires et relles, des modicateurs optionnels peuvent tre spcis (voir Section 2.3.1). Les constantes reprises dans un tableau doivent toutes tre du mme type. Des constantes peuvent tre calcules laide dune expression (cst-expr). Cette expression ne peut faire intervenir que dautres constantes et implique des oprateurs dcrits dans les sections 4.2 et 4.3.

2.2

Le programme

Un programme C a la structure suivante : progC : := (decl-fonct | def-fonct | decl-var | ext-var | def-struct | def-type)* progC est le symbole racine de notre description du langage C. Un programme C est donc dcrit par un entrelacement de dclarations/dnitions de fonction (voir Chapitre 3), de dclarations et dnitions de variables globales ou de constantes (voir Section 2.4), de dnitions de types structurs (voir Section 2.3.5) et de dnitions de types personnaliss (voir Section 2.3.6). Cette suite dlments peut tre rpartie en plusieurs chiers (voir Section 6.1).

2.3

Types

id-type ::= types-prim | struct-type | custom-id | void

Un identicateur de type peut reprsenter : un type primitif (types-prim, voir Section 2.3.1), le type spcial void (voir Section 2.3.3), un type structur (struct-type, voir Section 2.3.5), un type dni par le programmeur (custom-id, voir Section 2.3.6).

2.3.1

Types primitifs

types-prim ::= [unsigned|signed] char | [ unsigned|signed ] [short | (long [long])] int | float | [long] double

Les types primitifs sont : lentier : int, le caractre ou entier sur 8 bits : char, le nombre rel (simple prcision) : float, le nombre rel (double prcision) : double. Des modicateurs peuvent tre associs ces types de base : signed / unsigned : le type associ est sign / non-sign, short : diminue la taille de lentier long : augmente la taille de lentier ou la prcision dun nombre rel (double prcision vers prcision tendue), long long : augmente encore la taille de lentier.

2.3.2

Pointeurs

Pour indiquer quune variable de type T est un pointeur, son identicateur est prx lors de sa dclaration (voir Section 2.4) :

ptr-pref ::= (*)*

Le nombre dtoiles rprsente le nombre de niveaux de redirection : aucune toile : la variable nest pas un pointeur, 1 toile : la variable est un pointeur de T, 2 toiles : la variables est un pointeur de pointeur de T, ...

2.3.3

Type void

Le type void ne peut tre utilis que dans certaines circonstances particulires : avec un pointeur : on ne fait pas de supposition sur le type de la zone mmoire pointe. dans le contexte de la dclaration/dnition dune fonction (voir Chapitre 3).

2.3.4

Tableaux

Pour indiquer quune variable est un tableau, un sufxe est associ son identicateur lors de la dclaration (voir Section 2.4) :

arr-suff ::= ([[cst-entier]])*

Le nombre de paires daccolades reprsente le nombre de dimensions du tableau et la constante comprise entre les accolades reprsente la taille de la dimension associe : aucune paire daccolades : la variable nest pas un tableau,

[n1 ] : la variable est un vecteur de taille n1 , [n1 ][n2 ] : la variable est un tableau 2 dimensions de taille (n1 , n2 ), ...

2.3.5

Type structur

Un type structur est dni comme suit :

struct-type ::= struct [ nom-struct ] [ { liste-champs } ] liste-champs ::= (id-type ptr-pref id arr-suff (, ptr-pref id arr-suff) ;)* nom-struct ::= id

Une structure peut tre dnie sans pour autant devoir dclarer de variable :

def-struct ::= struct-type ;

2.3.6

Dnition de type

Le mot-cl typedef peut tre utilis pour reprsenter une dnition de type potentiellement complexe par un identicateur :

custom-id ::= id def-type ::= typedef id-type id ;

Cette construction est particulirement intressante pour remplacer la dnition dun type structur par un identicateur de type simple.

2.3.7

Chanes de caractres

Il ny a pas de type chane de caractres explicite en C. Celles-ci sont simplement reprsentes par un tableau de caractres. La n de la chane est indique par le caractre spcial \0. En pratique, cela implique quun tableau de N caractres peut contenir une chane dau plus (N 1) caractres, le N me caractre tant le caractre de terminaison de chane.

2.4

Dclaration de variables globales et de constantes

decl-var ::= [ static ] [ const ] id-type ptr-pref id arr-suff [= cst] (, ptr-pref id arr-suff [= cst] )* ; ext-var ::= extern type-id prt-pref id arr-suff ;

Lors de la dclaration dune variable, son type et son identicateur son dnis. Un prxe (ptr-pref) peut tre ajout lidenticateur de variable an dindiquer que la variable est un pointeur (voir Section 2.3.2). Un sufxe (arr-suff) permet dindiquer si la variable est un tableau (voir Section 2.3.4). Pour faciliter lcriture, un type peut tre associ une liste didenticateurs et leur prxe et sufxe. Dans lexemple qui suit, on dclare 4 variables : w un nombre rel reprsent en double prcision, x un entier, y un pointeur de pointeur dentier et z un tableau de 5 entiers. Le mot-cl static signie quune variable globale est statique cest--dire quelle a une porte limite au chier source dans lequel elle est dnie. Le mot-cl const signie que lon dnit une constante et non une variable. Dans le cas o une variable globale nest pas statique, elle peut tre utilise dans un autre chier source que celui o elle est dnie. La variable doit alors tre dclare (ext-var) dans les chiers o elle sera utilise.

2.5

Exemples de dclarations de types et variables

typedef struct A { int x; double z; } B; B c = {x : 0, z : 1E-2}; const double w = 3.14; int x = 0, **y = 0, z[5] = {1, 2, 3, 4, 5};

Lexemple ci-dessus reprend, dans lordre : la dnition dun type structur struct A reprsent par un identicateur B, la dclaration dune variable globale c de type B, la dclaration dune constante w qui a pour valeur 3, 14, la dclaration de 3 variables : x une variable entire, y un pointeur de pointeur dentier, z un tableau de 5 entiers.

Chapitre 3

Fonctions
Une fonction peut tre dclare (decl-fonct) plusieurs fois dans un programme ( condition que ce soit toujours de la mme manire) mais ne peut tre dnie (def-fonct) quune seule fois.

decl-fonct ::= [static] [const] id-type ptr-pref id ( proto-args-list ) ; proto-args-list ::= [ const ] id-type ptr-pref [ id ] arr-suff (, [ const ] id-type ptr-pref [ id ] arr-suff)* def-fonct ::= [static] [const] id-type ptr-pref id ( args-list ) bloc-instr args-list ::= [ const ] id-type ptr-pref id arr-suff (, [ const ] id-type ptr-pref id arr-suff)* bloc-instr ::= { instr-seq }

Le type ctif void (voir Section 2.3.3]) est utilis an dindiquer labsence de type de retour (la fonction est en fait une procdure). Il peut galement tre utilis pour indiquer labsence de paramtres dune fonction (la liste de types utilise lors de la dclaration dune fonction contient un lment : void). Le mot-cl static signie quune fonction est statique cest--dire quelle a une porte limite au chier source dans lequel elle est dnie. Le mot-cl const signie que la valeur de largument ou du type de retour associ est une constante. La dnition dune fonction inclu le corps de la fonction qui reprsent par un bloc dinstructions. Un bloc dinstructions contient une squence dinstructions.

instr-seq ::= ( instr ; | decl-loc-var | def-struct | def-type )* instr ::= base-instr | expr | return [ expr ]

Linstruction return a pour effet dinterrompre la fonction en cours dexcution et implique le renvoi de la valeur de lexpression spcie.

10

3.1

Variables locales

Lorsquune variable est dclare dans le corps dune fonction, elle est dite locale. Les variables locales sont dclares dune manire similaire aux variables globales. Elles peuvent cependant tre initialises avec la valeur dune expression et non plus seulement avec une constante.

decl-loc-var ::= [ static ] [ const ] id-type ptr-pref id arr-suff [= expr] (, ptr-pref id arr-suff [= expr] )* ;

Le mot-cl static permet de dclarer une variable locale statique : la valeur dune telle variable est prserve dun appel lautre de cette fonction.

3.2

La fonction main

Dans un programme C, exactement une fonction doit sappeler main. Les instructions constituant le corps de cette fonction seront excutes lappel du programme. La fonction main peut tre dclare de 2 manires diffrentes : int main(); int main(int argc, char *argv[]); Le premier prototype implique quon ignore les paramtres fournis au programme. Le deuxime prototype donne accs ces paramtres : argc est une variable entire qui indique le nombre darguments, argv est un tableau de chanes de caractres reprsentant ces arguments. La valeur de retour de la fonction main est utilis comme code de retour du programme. La fonction void exit(int code) permet dinterrompre lexcution du programme partir de nimporte o dans le code. Le code de retour du programme est celui donn en argument.

3.3

Exemples de dclarations de fonctions

void f(int *x, const char c); int *g(double); int h(void);

Lexemple ci-dessus comporte la dclaration de 3 fonctions : f est en fait une procdure et prend 2 arguments : un pointeur dentier x et une constante de type caractre c, 11

g est une fonction qui retourne un pointeur dentier et qui prend en argument un nombre rel reprsent en double prcision, h est une fonction qui ne prend aucun argument et qui retourne un entier.

12

Chapitre 4

Expressions
Une expression est une instruction excutable qui reprsente une valeur.

expr ::= cst | id | ( expr ) | affect-expr | arith-expr | logic-expr | arith-affect-expr | cond-expr | array-access-expr | eld-access-expr | func-call-expr | ptr-deref-expr | ptr-get-expr | type-conv-expr | pair-expr | sizeof-expr

4.1

Affectation

Laffectation permet de stocker une valeur dans un variable via un oprateur prenant deux oprandes.

affect-expr ::= expr = expr

Loprande de gauche doit avoir une valeur gauche : elle doit reprsenter un emplacement de stockage valide (une variable, un champ de structure, la case dun tableau). Par exemple, laffectation suivante est invalide :

(4*3) = 2;

Par contre, laffectation suivante est valide :

13

int *x; ... (*x) = 2;

4.2

Expressions arithmtiques

Une expression arithmtique fait intervenir des oprandes numriques et a galement une valeur numrique.

arith-expr ::= expr bin-arith-op expr | un-arith-op expr bin-arith-op ::= + | - | * | / | % un-arith-op ::= -

Les oprateurs arithmtiques sont les suivants : + : addition, - : soustraction (oprateur binaire) ou changement de signe (oprateur unaire), / : division, * : mutliplication, % : reste de la division (modulo). Le type de division dpend des oprandes : si les deux oprandes sont entires, alors la division entire est employe. Sinon, la division relle est utilise.

4.3

Expressions logiques

Une expression logique fait intervenir des oprandes boolennes ou numriques et a une valeur boolenne. Le C na pas de type boolen explicite. la place, une valeur entire est interprte comme une valeur de vrit : si une expression a comme valeur 0, elle aura comme valeur boolenne false ; si une expression a une valeur diffrente de 0, elle aura comme valeur boolenne true.

logic-expr ::= expr bin-logic-op expr | un-logic-op expr | expr bin-comp-op expr bin-logic-op ::= && | || un-logic-op ::= ! bin-comp-op ::= > | < | >= | <= | == | !=

Les oprateurs logiques sont les suivants : ! : ngation, && : et logique, 14

|| : ou logique. Les oprateurs de comparaison sont les suivants : > et < : ingalits strictes, >= et <= : ingalits non-strictes, == : galit, != : diffrence.

4.4

Affectations combines

Les oprateurs arithmtiques peuvent tre combins avec laffectation pour rduire lcriture. Lincrmentation et la dcrmentation possdent galement une criture raccourcie.

arith-affect-expr ::= expr com-affect-op expr | ++expr | --expr | expr++ | expr-com-affect-op ::= += | -= | *= | /= | %=

La premire oprande des oprateurs dcrits par le symbole com-affect-op doit tre une valeur gauche valide. De mme pour loprande des oprateurs dincrmentation et de dcrmentation. Les oprateurs ++ et -- permettent respectivement dincrmenter et de dcrmenter la valeur stocke dans une variable. Ainsi, soit x une variable entire, ++x et x++ (resp. --x et x--) incrmentent (resp. dcrmentent) la valeur de x. La diffrence entre la version prxe et la version sufxe est la valeur de lexpression : ++x a pour valeur le rsultat de lincrmentation et x++ a pour valeur la valeur de x avant incrmentation.

4.5

Condition

Lexpression conditionnelle se base sur un oprateur ternaire : la valeur de la premire oprande permet de slectionner une des valeurs des deux oprandes suivantes.

cond-expr ::= expr ? expr : expr

Lexpression qui prcde ? est une expression logique. Si sa valeur est true, la valeur de lexpression conditionnelle est la valeur de lexpression comprise entre ? et :. Sinon, la valeur de lexpression conditionnelle est la valeur de lexpression suivant :. Par exemple, lexpression (b ? 1 : 0) aura comme valeur 1 si la variable entire b a une valeur diffrente de 0. Sinon, lexpression vaut 0.

4.6

Accs aux lments dun tableau

Laccs aux lments dun tableau se fait via un oprateur prenant deux oprandes : un tableau et un indice. 15

array-access-expr ::= expr [ expr ]

Soit un tableau t la valeur de la premire oprande et un entier i la valeur de la seconde oprande. La valeur de lexpression est la valeur du (i + 1)me lment de t. La valeur de la premire oprande peut aussi tre un pointeur vers un tableau. Ce tableau peut avoir t allou dynamiquement (voir Chapitre 7). Par exemple, lexpression t[2] retourne le 3me lment du tableau t qui peut avoir la dclaration int *t; ou int t[N] o N est la taille du tableau.

4.7

Appel de fonction

Lappel de fonction se fait via un oprateur prenant au moins un oprande (la fonction appeler). Les oprandes suivants reprsentent les valeurs qui seront passes en argument la fonction.

func-call-expr ::= expr ( [expr-list] ) expr-list ::= expr (, expr)*

4.8

Accs au pointeur

La valeur du pointeur dune variable est obtenue via un oprateur unaire.

ptr-get-expr ::= & expr

La valeur de loprande doit tre une valeur gauche valide (voir Section 4.1). Par exemple, soit x une variable entire, alors lexpression &x a pour valeur le pointeur de x.

4.9

Drfrencement de pointeur

La valeur dune variable pointe est obtenue via un oprateur unaire.

ptr-deref-expr ::= ptr-pref expr

16

La valeur de loprande doit tre une valeur gauche valide (voir Section 4.1). Par exemple, soit x un pointeur dentier, alors lexpression *x a pour valeur lentier contenu dans la variable pointe.

4.10

Accs au champ dune structure

Laccs au champ dune structure peut se faire via deux oprateurs prenant deux oprandes : . : une structure et un identicateur de champ, -> : un pointeur de structure et un identicateur de champ,

eld-access-expr ::= expr.id | expr->id

La valeur de la premire oprande doit tre une structure (.) ou un pointeur de structure (->). La valeur de cette expression est la valeur du champ demand dans la structure donne. Loprateur -> est un raccourci dcriture. Soit s un pointeur de structure et x lidenticateur dun champ entier de la structure pointe par s, alors lexpression ((*s).x) est quivalente lexpression (s->x).

4.11

Conversion de type explicite

Loprateur de conversion de type prend deux oprandes : un type de destination et une valeur dont le type va tre converti.

type-conv-expr ::= ( id-type ptr-pref ) expr

4.12

Paire dexpressions

pair-expr ::= expr , expr

La valeur dune paire dexpressions est la valeur de la deuxime expression de la paire. Par exemple, lexpression (1, 2) a pour valeur 2.

17

4.13

Taille dun type

sizeof-expr ::= sizeof ( expr | id-type ptr-pref arr-suff )

Loprateur sizeof prend comme oprande une valeur gauche ou un type et a comme valeur la taille en octets du type associ la valeur gauche ou du type spci. Par exemple, sizeof(int *) a pour valeur le nombre doctets ncessaire pour reprsenter un pointeur dentier.

18

Chapitre 5

Instructions
Contrairement lexpression, linstruction na pas de valeur.

base-instr ::= bloc-instr | cond-instr | loop-instr | break | continue

5.1

Choix conditionnels

Le langage C reprend deux types de conditions.

cond-instr ::= if-cond | switch-cond

5.1.1

Choix conditionnel binaire

Une expression est utilise comme gardien. Si cette expression a la valeur true, linstruction qui suit le gardien est excute. Sinon, si elle est spcie, cest linstruction qui suit le mot-cl else qui est excute.

if-cond ::= if ( expr ) instr [ else instr ]

Par exemple, la suite dinstructions suivante implique que la variable b aura toujours comme valeur 1.

19

int b; if(1) b = 1; else b = 0;

5.1.2

Choix conditionnel multiple

switch-cond ::= switch ( expr ) { switch-cases [switch-default] } switch-cases ::= (case cst : instr)* switch-default ::= default : instr

Une expression est utilise comme gardien. Linstruction excuter est slectionne parmi une liste de cas proposs. Si la valeur de la constante associe un cas est gale la valeur du gardien, alors les instructions qui suivent le cas sont excutes jusqu rencontrer la n du bloc switch (cest--dire laccolade fermante du bloc switch) ou le mot-cl break. Par exemple, les instructions ci-dessous impliquent la dnition suivante pour la variable x : x= 3n 1 si 0 n 2 si n < 0 ou n > 2

int x = 0; switch(n) { case 0 : ++x; case 1 : ++x; case 2 : ++x; break; default : x = -1; }

5.2

Boucles

Il y a essentiellement 3 types de boucles en C.

loop-instr ::= while-loop | do-loop | for-loop

20

5.2.1

Boucle while

while-loop ::= while ( expr ) instr

Une expression est utilise comme gardien. Une instruction est excute tant que le gardien est true. Par exemple, la boucle suivante incrmente la variable x jusqu ce quelle atteigne la valeur 10.

int x = 0; while(x < 10) ++x;

5.2.2

Boucle do

do-loop ::= do instr while ( expr )

Une expression est utilise comme gardien. Une instruction est excute tant que le gardien est true. Le gardien est valu aprs lexcution de linstruction, ce type de boucle implique donc toujours au moins une itration. Par exemple, la boucle suivante incrmente la variable x jusqu ce quelle atteigne la valeur 10.

int x = 0; do ++x; while(x < 10);

5.2.3

Boucle for

for-loop ::= for ( [for-init] ; [expr] ; [expr] ) instr for-init ::= for-var-decl | expr for-var-decl ::= id-type ptr-pref id arr-suff (, ptr-pref id arr-suff)*

La boucle for implique 4 lments : 21

for-init : les instructions excutes avant lexcution de la boucle ces instructions peuvent tre des dclarations de variables ; premier expr : le gardien valu avant chaque itration si le gardien est true, la boucle continue son excution ; second expr : les instructions excutes la n de chaque itration ; instr : les instructions excutes chaque itration (avant celles du second expr). Les 3 premiers lments sont optionnels. Labsence de gardien revient remplacer lexpression par une constante diffrente de 0 (donc true). Par exemple, la boucle suivante incrmente la variable x jusqu ce quelle atteigne la valeur 10.

for(int x = 0; x < 10; ++x);

5.2.4

Instructions de rupture de squence

Linstruction break peut tre utilise pour interrompre lexcution dune boucle. Lexcution reprend la premire instruction suivant la boucle. Linstruction continue peut tre utilise pour interrompre lexcution dune itration de boucle. Lexcution reprend au dbut de litration suivante de la boucle si le gardien est vri et la premire instruction suivant la boucle sinon. Mis part break qui peut tre utilis dans le contexte dun bloc switch, les instructions de rupture de squence ne peuvent tre utilises que dans le corps dune boucle.

22

Deuxime partie

Outils de base

23

Chapitre 6

Prprocesseur
Les compilateurs du langage C incluent un outil appel prprocesseur . Cet outil permet notamment la dnition de variables (qui ne sont pas des variables du programme C cependant) et une forme de manipulation de chiers. Les directives donnes au prprocesseur tiennent gnralement sur une ligne prxe par le symbole # suivi dune commande.

6.1

Inclusion de chier

La directive #include permet linclusion du contenu dun chier dans un autre. Soit un chier file1 dont le contenu est not A. Soit un autre chier file2 contenant la directive #include "file1" ou #include <file1>. Soient B1 le contenu du chier file2 avant la directive dinclusion et B2 le contenu du chier file2 aprs la directive dinclusion. Si le chier file2 est fourni en entre un compilateur C, celui-ci compilera B1 AB2 , savoir le contenu du chier file1 inclus dans le chier file2. Les directives dinclusion de chier permettent de rpartir un programme C dans plusieurs chiers, do une possibilit de structurer son code. Lutilisation des <> implique que le chier inclure fait partie de la librairie standard du C ou dune autre librairie considre comme faisant partie du systme de compilation. Lutilisation des "" indique que le chier inclure t dni par le programmeur dans le contexte de son programme.

6.1.1

Sparation interface / implmentation

Pour crire du code gnrique et rutilisable, la sparation entre interface et implmentation est un outil de base. Linterface reprsente une description de comment les fonctionnalits proposes par une bibliothque peuvent tre utilises tandis que limplmentation dcrit la manire dont ces fonctionnalits seront excutes. Une bibliothque C se prsente donc gnralement sous la forme de son interface, rpartie dans un ou plusieurs chiers en-tte, et son implmentation rpartie dans un ou plusieurs chiers source. Les chiers en-tte ont gnralement lextension h et contiennent les dclarations de type, fonctions et variables globales.

24

Les chiers source ont gnralement lextension c et contiennent les dnitions de fonctions et variables globales ainsi que des dnitions de types privs cest--dire des types qui ne sont pas accessibles via linterface. Toutes les fonctions dnies dans un chier source ne doivent pas tre dclares dans le chier en-tte associ. En effet, certaines fonctions sont propres limplmentation de la bibliothque et ne devraient pas tre accessibles lutilisateur.

6.2

Dnition de macros

La directive #define permet la dnition de macros. Une dnition de macro consiste en lassociation dun texte de substitution un nom de macro. Les occurences du nom de macro dans le programme C sont remplaces par le texte de substitution. Le texte de substitution peut tre paramtr par des arguments de macro. Ces arguments sont reprsents par des identicateurs qui peuvent apparatre dans le texte de substitution. Lorsquune macro est mentionne dans le programme, des valeurs sont associes ces paramtres et sont intgres dans le texte de substitution qui va remplacer la macro. La syntaxe dune dnition de macro est la suivante : #dene name [ (id (, id)*) ] text

25

Chapitre 7

Gestion de la mmoire
Les fonctions de gestion de la mmoire prsentes dans ce chapitre sont accessibles via le chier en-tte <stdlib.h>.

7.1

Allocation dynamique

La fonction void *malloc(unsigned int n) alloue un bloc de n octets sur le tas et retourne un pointeur vers ce bloc ou NULL en cas derreur. La fonction void *realloc(void *p, unsigned int n) tente de redimensionner le bloc point par p (qui doit prcdemment avoir t allou) an de lui donner une nouvelle taille n. Le bloc peut tre dplac. La fonction retourne un pointeur vers le nouvel emplacement du bloc ou NULL en cas derreur.

7.2

Dsallocation dynamique

La fonction void free(void *p) libre le bloc point par p (qui doit prcdemment avoir t allou). Si p vaut NULL, lappel na aucun effet.

26

Chapitre 8

Entres/sorties
Les fonctions dentre/sortie sont accessibles via le chier <stdio.h>.

8.1

Entres/sorties standard formates

Gnralement, la sortie standard est la console et lentre standard le clavier. crire quelque chose sur la sortie standard revient donc afcher des donnes lcran et lire partir de lentre standard revient rcuprer des donnes fournies par lutilisateur via le clavier.

8.1.1

Sorties

La fonction int printf(const char *format, ...) permet dcrire des donnes formates sur la sortie standard. Elle retourne le nombre de caractres crits en cas de succs et un nombre ngatif sinon. Cette fonction prend au moins un argument : une chane de caractres reprsentant le format des donnes afcher. Cette chane peut contenir des marqueurs qui indiquent o et comment des valeurs passes en argument devront tre afches. Ces marqueurs ont la syntaxe suivante : %[drapeau][largeur][.prcision][longueur]spcificateur Les diffrents arguments dun marqueur servent : spcier le type de donne afcher (spcicateur et longueur, voir tables 8.5 et 8.4 respectivement), contrler la quantit de caractres afcher (largeur et prcision, voir tables 8.2 et 8.3 respectivement), contrler la manire dont le remplissage est effectuer (voir Table 8.1).

8.1.2

Entres

La fonction int scanf(const char *format, ...) permet de lire des donnes formates partir de lentre standard. Elle retourne le nombre de donnes qui ont t correctement lues. Ce nombre peut tre infrieur au nombre de donnes qui devraient tre lues en cas derreur. Si une erreur dentre intervient avant mme quune donne ne soit lue, une valeur ngative est retourne. 27

Drapeau + espace #

Description Justication gauche (par dfaut, justication droite). Force lafchage du signe. Si le nombre est positif, un espace est introduit la place du signe. Avec les spcicateurs o, x et X, prxe la valeur afcher avec respectivement 0, 0x ou 0X si la valeur est diffrente de 0. Avec les spcicateurs e, E, g, G et f, force lafchage du point, mme en labsence de chiffres aprs la virgule. Les espaces ajouts gauche du nombre pour remplir lespace spci sont remplacs par des 0. TABLE 8.1 Drapeaux de format.

Largeur nombre *

Description Le nombre minimum de caractres afcher. Si la valeur afcher est trop courte, des espaces ou des zros sont ajouts gauche de celui-ci. Le nombre minimum de caractres afcher nest pas spci dans la chane de format mais via un argument entier pass avant largument associ ce marqueur. TABLE 8.2 Largeur de format.

Prcision nombre

Description Avec les spcicateurs d, i, o, u, x, X : donne le nombre minimum de chiffres afcher. Si la valeur afcher est trop courte, des zros sont ajouts gauche du nombre. Avec les spcicateurs e, E, F : donne le nombre de chiffres afcher aprs la virgule. Avec les spcicateurs g, G : donne le nombre maximum de chiffres signicatifs afcher aprs la virgule. Avec le spcicateur s : donne le nombre maximum de caractres afcher. Le nombre minimum de caractres afcher nest pas spci dans la chane de format mais via un argument entier pass avant largument associ ce marqueur. TABLE 8.3 Prcision de format.

Longueur h l L

Description Avec les spcicateurs i, o, d, u, x, X, largument est interprt comme un short int ou unsigned short int. Avec les spcicateurs i, o, d, u, x, X, largument est interprt comme un long int ou unsigned long int. Avec les spcicateurs e, E, f, g, G, largument est interprt comme un long double. TABLE 8.4 Longueur de format. 28

Spcicateur c d ou i e E f g G o s u x X p n

Sortie Caractre Entier dcimal sign Notation scientique utilisant e Notation scientique utilisant E Nombre rel dcimal Notation la plus courte choisie entre %e et %f Notation la plus courte choisie entre %E et %f Entier octal sign Chane de caractres Entier dcimal non sign Entier hexadcimal non sign Entier hexadcimal non sign (avec lettres en majuscule) Adresse mmoire (pointeur) Rien nest afch. Largument associ doit tre un pointeur dentier qui contiendra le nombre caractres qui ont t afchs jusque l. % TABLE 8.5 Spcicateurs de format.

Exemple a 392 3.9265e+2 3.9265E+2 392.65 392.65 392.65 610 exemple 7235 7fa 7FA B800 :0000 a

Comme printf, cette fonction prend au moins un argument : une chane de caractres reprsentant le format des donnes lire. Cette chane peut contenir les lments suivants : un caractre espace : indique qu ce point, la fonction va ignorer tous les espaces, retours la ligne et tabulations qui seront lus partir de lentre ; un caractre qui nest ni un espace, ni un signe de pourcentage (%) : la fonction lit un caractre partir de lentre standard et le compare au caractre de la chane de format. Si les caractres correspondent, la fonction passe au caractre suivant de la chane de formatage et de lentre. Sinon, la fonction interrompt son excution ; un marqueur (prx par le signe de pourcentage) : la fonction va tenter de lire une donne partir de lentre standard et la stocker dans une variable dont le pointeur est pass en argument scanf puis passera la suite de la chane de formatage en cas de succs. Un marqueur a la forme suivante : %[*][largeur][longueur]spcificateur o : * indique que la donne associe au marqueur doit tre lue partir de lentre mais pas stocke dans la variable associe, largeur indique le nombre maximum de caractres lire lors de lacquisition de la donne, longueur et spcificateur donne le type de donne lire (voir tables 8.6 et 8.7).

8.2

Fichiers

Le type FILE reprsente un handle de chier. Un pointeur vers une instance de ce type est retourne par la fonction douverture de chier. Ce pointeur peut ensuite tre pass en argument la plupart des 29

Spcicateur c d or i e E f g G o s u x X

Sortie Caractre Entier dcimal sign (ventuellement prcd de + ou -) Notation scientique utilisant e (ventuellement prcd de + ou -) Notation scientique utilisant E (ventuellement prcd de + ou -) Nombre rel dcimal (ventuellement prcd de + ou -) Notation choisie entre %e et %f Notation choisie entre %E et %f Entier octal sign Chane de caractres Entier dcimal non sign Entier hexadcimal non sign Entier hexadcimal non sign (avec lettres en majuscule) TABLE 8.6 Spcicateurs de format.

Type de largument char * int * float * float * float * float * float * int * char * unsigned int * int * int *

Longueur h l

Description Avec les spcicateurs i, o, d, u, x, X, largument attendu est de type short int * ou unsigned short int *. Avec les spcicateurs i, o, d, u, x, X, largument attendu est de type long int * ou unsigned long int *. Avec les spcicateurs e, E, f, g, G, largument attendu est de type double *. Avec les spcicateurs e, E, f, g, G, largument attendu est de type long double *. TABLE 8.7 Longueur de format.

30

fonctions de manipulation de chier.

8.2.1

Ouverture et fermeture de chier

Un chier peut tre ouvert en utilisant la fonction FILE * fopen(const char *filename, const char *mode) qui retourne un pointeur vers un handle si louverture a t correctement effectue et NULL sinon. Largument filename reprsente le nom du chier ouvrir. Le format de ce nom est dpendant du systme dexploitation. Largument mode indique le type daccs de chier : "r" ouvre un chier en lecture seule ; le chier doit exister. "w" ouvre un chier en criture ; si le chier existe dj, celui-ci est vid. Sinon, un chier vide est cr. "r+" ouvre un chier existant en lecture et criture ; ce mode peut tre utilis pour la mise jour de chiers. "w+" ouvre un chier en lecture et criture ; si le chier existe, il est vid de son contenu. Sinon, un chier vide est cr. "a+" ouvre un chier dans un mode ajout de donnes ; les donnes ne seront crites quen n de chier. Par contre, les donnes peuvent tre lues nimporte o. Par dfaut, les chiers sont ouverts en mode texte . Lorsquun chier doit tre ouvert en mode binaire , le sufxe b doit tre ajout en n de mode. La fonction int fclose(FILE *stream) fermer le chier fourni en argument et retourne 0 en cas de succs. Une valeur ngative est retourne en cas derreur. Lors de la fermeture dun chier, le contenu du tampon de sortie li ce chier est crit dans le chier. La fonction int fflush(FILE *stream) permet dcrire le contenu du tampon de sortie dans le chier et de vider celui-ci sans fermer le chier. Cette fonction retourne 0 en cas de succs et une valeur diffrente de 0 sinon.

8.2.2

tat dun chier ouvert

Certaines fonctions permettent dobtenir une indication sur ltat dun chier ouvert : Est-on arriv en n de chier ? Ene erreur est-elle survenue ? Etc. int feof(FILE *stream) retourne une valeur diffrente de 0 si la n de chier a t atteinte et 0 sinon. int ferror(FILE *stream) retourne une valeur diffrente de 0 si une erreur sest produite lors de la manipulation du chier et 0 sinon.

8.2.3

Dplacemement de la tte de lecture/criture

La fonction int fseek(FILE *stream, long int offset, int origin) permet de dplacer la tte de lecture/criture dun chier de offset positions partir du point de dpart origin. La fonction retourne 0 en cas de succs et une valeur ngative sinon. offset est exprim en octets et peut tre ngatif (dplacement vers la gauche ). origin reprsente le point de dpart du dplacement effectuer. Voici ses 3 valeurs possibles : SEEK_SET : le point de dpart est le dbut du chier, SEEK_CUR : le point de dpart est la position courante dans le chier,

31

SEEK_END : le point de dpart est la n du chier. Une autre fonction intressante lorsquon dplace la tte de lecture/criture est long int ftell(FILE *stream) qui retourne la position courante de la tte de lecture/criture dans le chier stream ou une valeur ngative en cas derreur.

8.2.4

Entres/sorties non formates sur des chiers

La fonction int fgetc(FILE *stream) lit le caractre prsent sous la tte de lecture et avance celleci dune position tant que la n de chier na pas t atteinte. La fonction retourne le caractre lu ou EOF si la n de chier a t atteinte ou une erreur a t rencontre. La fonction int fputc(int character, FILE *stream) crit le caractre donn via largument character sous la tte de lecture et avance celle-ci dune position. La fonction retourne le caractre crit ou EOF si une erreur a t rencontre. Pour de meilleures performances, il est recommand dcrire ou lire des blocs de donnes plutt que caractre par caractre. Les fonctions suivantes permettent ces oprations. size_t fread(void *ptr, size_t size, size_t count, FILE *stream) permet de lire count lments de taille size et de les stocker dans une zone pointe par ptr. La fonction retourne le nombre doctets qui ont t lus. Cette valeur peut tre infrieure (size * count) si la n de chier a t atteinte ou une erreur sest produite. size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream) permet dcrire count lments de taille size dans un chier. Ces lments sont issus de la zone pointe par ptr. La fonction retourne le nombre doctets qui ont t crits. Cette valeur peut tre infrieure (size * count) si une erreur sest produite.

8.2.5

Entres/sorties formates sur des chiers

La fonction int fprintf(FILE *stream, const char *format, ...) sutilise de la mme manire que la fonction printf (voir Section 8.1.1) mais requiert un argument supplmentaire stream spciant un chier. La fonction int fscanf(FILE *stream, const char *format, ...) sutilise de la mme manire que la fonction scanf (voir Section 8.1.2) mais requiert un argument supplmentaire stream spciant un chier.

32

Chapitre 9

Manipulation de chanes de caractres


La librairie standard du langage C inclus des fonctions de base de manipulation de chanes de caractres : copie, comparaison, concatnation, etc. Celles-ci sont dclares dans le chier <string.h>.

9.1

Taille

size_t strlen(const char *s) retourne la longueur de la chane pointe par s cest--dire le nombre de caractres qui prcdent le caractre de terminaison de chane \0.

9.2

Initialisation

void *memset(void * ptr, int val, size_t num) initialise les num premier octets de la zone pointe par ptr val (interprt comme un unsigned char). La fonction retourne ptr.

9.3

Copie

void *memcpy(void * dest, const void * src, size_t num) copie une sous-chane de taille num (en octets) partir dune zone source src vers une zone de destination dest. La terminaison de chane nest pas prise en compte lors de la copie. La fonction retourne dest. void *strcpy(char * dest, const char * src copie les caractres, y compris le caractre de terminaison de chane, dune chane pointe par src vers une zone de destination dest. La fonction retourne dest. void *strncpy(char * dest, const char * src, size_t num) copie les num premiers caractres dune chane pointe par src vers une zone de destination dest. Si la taille s de la chane src est plus petite que num, le caractre \0 est insr (num s) fois la suite de la chane copie dans dest. Le caractre de terminaison de chane nest pas implicitement insr la n de la chane dans la zone de destination. La fonction retourne dest. strncpy devrait tre prfre strcpy car elle permet de se protger explicitement contre un overow (la chane pointe par src est trop grande pour tenir dans lespace point par dest).

33

9.4

Comparaison

int memcmp(const void * p1, const void * p2, size_t num) compare une les num premiers octets de deux zones pointes par p1 et p2. La fonction retourne un entier x dni comme suit : x = 0 : les octets compars sont gaux, x > 0 : deux octets diffrents ont t trouvs la position la plus petite i et sont tels que p1[i] > p2[i], x < 0 : deux octets diffrents ont t trouvs la position la plus petite i et sont tels que p1[i] < p2[i]. void *strcmp(const char * s1, const char * s2, size_t num) compare au maximum les num premiers caractres des deux chanes pointes par s1 et s2. La fonction retourne un entier x dni comme suit : x = 0 : les num premiers caractres des chanes compares sont gaux, x > 0 : deux caractres diffrents ont t trouvs la position la plus petite i et sont tels que s1[i] > s2[i], x < 0 : deux caractres diffrents ont t trouvs la position la plus petite i et sont tels que s1[i] < s2[i].

9.5

Concatnation

char *strcat (char *dest, char *src, size_t num) copie les num premiers caractres de la chane pointe par src plus le caractre de terminaison de chane la suite de la chane pointe par dest. Si la chane pointe par src est plus petite que num, seuls les caractres prcdent le caractre de terminaison de chane sont copis. La fonction retourne dest.

9.6

Entres/sorties formates sur des chanes de caractres

La fonction int sprintf(char *str, const char *format, ...) sutilise de la mme manire que la fonction printf (voir Section 8.1.1) mais requiert un argument supplmentaire str spciant une chane de caractres dans laquelle les donnes formates seront crites. La fonction int sscanf(const char *str, const char *format, ...) sutilise de la mme manire que la fonction scanf (voir Section 8.1.2) mais requiert un argument supplmentaire str spciant une chane de caractres partir de laquelle des donnes formates seront lues.

34

Chapitre 10

Exemples de programme C
Ce chapitre reprend quelques exemples de programmes simples. Chaque exemple est accompagn dun texte explicatif ainsi que de pointeurs vers les sections dcrivant les outils utiliss.

10.1

Hello world

Ce programme se contente dafcher le message Hello world sur la sortie standard. Il commence par inclure (voir Section 6.1) le chier en-tte dnissant les fonctions dentre/sortie standard (voir Chapitre 8). Le comportement de la fonction main (voir Section 3.2) est constitu de 2 instructions : un appel (voir Section 4.7) la fonction printf (voir Section 8.1.1) ainsi quun appel linstruction return (voir Chapitre 3) impliquant que le code de retour du programme est 0. #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello world\n"); return 0; }

10.2

Types

Ce programme dnit quelques variables locales et afche leur valeur sur la sortie standard. Il commence par inclure (voir Section 6.1) le chier en-tte dnissant les fonctions dentre/sortie standard (voir Chapitre 8). Le comportement de la fonction main (voir Section 3.2) est constitu de 4 dclarations de variables (voir Section 3.1) suivies de 4 appels (voir Section 4.7) la fonction printf (voir Section 8.1.1). Un appel linstruction return (voir Chapitre 3) impliquant que le code de retour du programme est 0. Les 4 dclarations sont les suivantes (voir Section 2.3 pour les types et Section 2.1 pour les constantes) : une variable ix de type int (nombre entier) initialise la valeur 2.

35

une variable dx de type double (nombre virgule ottante en double prcision) initialise la valeur 1. une variable cx de type char (caractre ou entier sur 8 bits) initialise la valeur c. une variable str de type const char * (chane de caractres constante) initialise la valeur "string". #include <stdio.h> int main(int argc, char *argv[]) { int ix = 2; double dx = 1.; char cx = c; const char *str = "string"; printf("ix=%d\n", ix); printf("dx=%f\n", dx); printf("cx=%c\n", cx); printf("str=%s\n", str); return 0; }

36

Index
#define, 25 #include, 24 affect-expr, 13 arith-affect-expr, 15 arith-expr, 14 arr-suff, 7 array-access-expr, 16 base-instr, 19 bin-arith-op, 14 bin-comp-op, 14 bin-logic-op, 14 bin-op, 5 bloc-instr, 10 break, 19, 22 car, 5 case, 20 char, 6 cond-expr, 15 cond-instr, 19 const, 911 continue, 19, 22 cst, 5 cst-array, 5 cst-car, 5 cst-chaine, 5 cst-entier, 5 cst-expr, 5 cst-reel, 5 cst-struct, 5 custom-id, 8 decl-fonc, 10 decl-loc-var, 11 decl-var, 9 def-fonct, 10 def-struct, 8 def-type, 8 digit, 5 37 do, 21 do-loop, 21 double, 6 exit, 11 expr, 13 ext-var, 9 extern, 9 fclose, 31 feof, 31 ferror, 31 fflush, 31 fgetc, 32 eld-access-expr, 17 FILE, 29 float, 6 fopen, 31 for-loop, 21 fprintf, 32 fputc, 32 fread, 32 free, 26 fscanf, 32 fseek, 31 ftell, 32 func-call-expr, 16 fwrite, 32 id, 5 id-type, 6 if-cond, 19 instr, 10 instr-seq, 10 letter, 5 logic-expr, 14 long, 6 loop-instr, 20 main, 11

malloc, 26 memcmp, 34 memcpy, 33 memset, 33 pair-expr, 17 print, 27 progC, 6 ptr-deref-expr, 16 ptr-get-expr, 16 ptr-pref, 7 realloc, 26 return, 10 scanf, 27 short, 6 signed, 6 sizeof, 18 sizeof-expr, 18 sprintf, 34 sscanf, 34 static, 911 strcat, 34 strcmp, 34 strcpy, 33 strlen, 33 strncpy, 33 struct, 8 struct-type, 8 switch-cond, 20 type-conv-expr, 17 typedef, 8 types-prim, 6 un-arith-op, 14 un-logic-op, 14 un-op, 5 unsigned, 6 void, 6, 7, 10 while-loop, 21

38

Table des matires


1 Introduction 1.1 Description de la syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Utilisation du document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Description gnrale dun programme C . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2

I
2

Syntaxe
lments de base 2.1 identicateurs et constantes . . . . . . . . . . . . 2.2 Le programme . . . . . . . . . . . . . . . . . . . 2.3 Types . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Types primitifs . . . . . . . . . . . . . . 2.3.2 Pointeurs . . . . . . . . . . . . . . . . . 2.3.3 Type void . . . . . . . . . . . . . . . . 2.3.4 Tableaux . . . . . . . . . . . . . . . . . 2.3.5 Type structur . . . . . . . . . . . . . . . 2.3.6 Dnition de type . . . . . . . . . . . . . 2.3.7 Chanes de caractres . . . . . . . . . . . 2.4 Dclaration de variables globales et de constantes 2.5 Exemples de dclarations de types et variables . .

4
5 5 6 6 6 7 7 7 8 8 8 9 9 10 11 11 11 13 13 14 14

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

Fonctions 3.1 Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Exemples de dclarations de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . Expressions 4.1 Affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Expressions arithmtiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Expressions logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 5

Affectations combines . . . . . Condition . . . . . . . . . . . . Accs aux lments dun tableau Appel de fonction . . . . . . . . Accs au pointeur . . . . . . . . Drfrencement de pointeur . . Accs au champ dune structure Conversion de type explicite . . Paire dexpressions . . . . . . . Taille dun type . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

15 15 15 16 16 16 17 17 17 18 19 19 19 20 20 21 21 21 22

Instructions 5.1 Choix conditionnels . . . . . . . . . . . . . 5.1.1 Choix conditionnel binaire . . . . . 5.1.2 Choix conditionnel multiple . . . . 5.2 Boucles . . . . . . . . . . . . . . . . . . . 5.2.1 Boucle while . . . . . . . . . . . . 5.2.2 Boucle do . . . . . . . . . . . . . . 5.2.3 Boucle for . . . . . . . . . . . . . . 5.2.4 Instructions de rupture de squence

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

II
6

Outils de base
Prprocesseur 6.1 Inclusion de chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 Sparation interface / implmentation . . . . . . . . . . . . . . . . . . . . . . . 6.2 Dnition de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestion de la mmoire 7.1 Allocation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Dsallocation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Entres/sorties 8.1 Entres/sorties standard formates . . . . . . . . . . 8.1.1 Sorties . . . . . . . . . . . . . . . . . . . . 8.1.2 Entres . . . . . . . . . . . . . . . . . . . . 8.2 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Ouverture et fermeture de chier . . . . . . . 8.2.2 tat dun chier ouvert . . . . . . . . . . . . 8.2.3 Dplacemement de la tte de lecture/criture

23
24 24 24 25 26 26 26 27 27 27 27 29 31 31 31

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

40

8.2.4 8.2.5 9

Entres/sorties non formates sur des chiers . . . . . . . . . . . . . . . . . . . Entres/sorties formates sur des chiers . . . . . . . . . . . . . . . . . . . . .

32 32 33 33 33 33 34 34 34 35 35 35 37

Manipulation de chanes de caractres 9.1 Taille . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Initialisation . . . . . . . . . . . . . . . . . . . . . . . 9.3 Copie . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4 Comparaison . . . . . . . . . . . . . . . . . . . . . . 9.5 Concatnation . . . . . . . . . . . . . . . . . . . . . . 9.6 Entres/sorties formates sur des chanes de caractres

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

10 Exemples de programme C 10.1 Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Index

41

Você também pode gostar