Vous êtes sur la page 1sur 9

Enseignant : Mohamed Bécha Kaâniche

Module : Langage C – Programmation C


Année Universitaire : 2015-2016

Chapitre 1 : Eléments de base du langage C


1. L’alphabet du langage
L’alphabet du langage C content :

a) Les lettres minuscules a..z, les lettres majuscules A..Z et le souligné « _ ».


b) Les chiffres décimaux 0..9.
c) Les symboles spéciaux :
! " # % & ' ( ) * + , -
. / : ; < = > ? [ \ ] ^
{ | } ~
d) Les espaces, les tabulations horizontales et verticales et les retours à la ligne.

Attention :

Le langage C fait la différence entre minuscule et majuscule.

2. Règles de formation des mots du langage


Une unité syntaxique est le plus simple élément lexical du langage. Les diverses catégories d’unités
syntaxiques sont les suivants :

 les identificateurs,
 les mots-clés,
 les littéraux,
 les opérateurs,
 les séparateurs.

2.1. Les identificateurs


Les identificateurs servent à nommer les variables et les fonctions manipulées par le programmeur.
Ce sont des chaînes de caractères de longueur quelconque dont le premier caractère doit être
alphabétique, les autres alphanumériques. Le blanc souligné « _ » compte pour un caractère
alphabétique et l’on distingue minuscules et majuscules:

I, i, l, L, t_1, _FF, k2000, K2000 sont tous des identificateurs valides et distincts.

Attention :

 Il est interdit d’utiliser les mots réservés du langage comme identificateurs. La liste de ces
mots-clés est donnée dans la sous-section suivante.
 Si la taille d’un identificateur est a priori quelconque, le nombre de caractères significatifs,
est fixé à 31 par la norme ANSI.
 Par convention, les identificateurs commençant par le blanc souligné et une lettre
majuscule sont réservés comme variables dans les bibliothèques externes.

1 Chapitre 1 : Eléments de base du langage C


Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

2.2. Les mots-clés


La norme C ANSI (C89) introduit 32 mots-clés (mots réservés ayant chacun une signification
précise) :

 Mots-clés pour les types de données : « char », « int », « long », « unsigned », « signed »,
« short », « float », « double », « struct », « union », « enum » et « void ».
 Mots-clés pour la classe de mémorisation des variables : « auto », « register », « extern »,
« static », « typedef », « volatile » et « const ».
 Mots-clés pour les instructions de contrôle : « switch », « case », « break », « default »,
« if », « else », « while », « do », « for », « continue » et « goto ».
 Mot-clé de retour de valeur d’une fonction : « return ».
 Mot-clé/opérateur : « sizeof ».

2.3. Les littéraux


2.3.1. Les littéraux entiers
Les notations utilisées pour écrire les littéraux entiers sont :

 La notation décimale : -15 0 133


 La notation octale : 0643 01 014 (commence par 0)
 La notation hexadécimale : 0XA0B 0xAF 0x1c (commence par 0x ou
0X : zéro x ou zéro X)

Les chiffres retenus pour la notation octale sont les symboles de 0 à 7. Ceux utilisés pour la
notation hexadécimale sont les symboles 0 à 9 et A à F (majuscules ou minuscules).

2.3.2. Les littéraux réels


Les notations pour écrire les littéraux réels sont :

 La notation fixée : 1.35 -15.67 9.84


 La notation flottante : 34.12E8 3.14e-10 -5.97e+4

2.3.3. Les littéraux caractères


Les littéraux caractères permettent de désigner les valeurs entières correspondant aux codes
ASCII des caractères, plusieurs notations peuvent être utilisées :

 La notation éditable : on peut définir un caractère en représentation éditable en plaçant


le caractère en question entre apostrophe : ‘A’ ’4’ ‘$’ ‘;’ ‘:’ ‘ ’
 La notation octale : on peut définir un caractère en représentation octale en préfixant le
nombre octal (1 ou 2 ou 3 chiffres de 0..7) du caractère \ comme suit : ‘\0’ ‘\14’
 La notation hexadécimale : on peut définir un caractère en représentation hexadécimal
en préfixant le nombre hexadécimal (1 ou 2 chiffres de 0..9, a..f, A..Z) de \x : ‘\x41’
 La notation symbolique : ‘\a’ Signal sonore, ‘\n’ retour à la ligne, ‘\r’ retour du
curseur au début de la ligne, ‘\b’ reculer le curseur d’une case, ‘\f’ déplacement à la
page suivante, ‘\t’ tabulation horizontal, ‘\v’ tabulation verticale, ‘\’’ apostrophe,
‘\\’ Antislash.
2 Chapitre 1 : Eléments de base du langage C
Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

2.3.4. Les littéraux chaînes de caractères


Les chaînes de caractères sont placés entre guillemet (double quote) : elles peuvent contenir des
caractères en notation éditable, octal, hexadécimal ou symbolique. Lorsque les chaines de
caractères sont mémorisées, elles sont complétées automatiquement par le caractère NUL
(‘\0’). Ce terminateur est nécessaire pour la bonne exécution de certaines fonctions standards
(p.ex. celle pour l’édition de chaîne de caractères) ; il permet à la fonction de déterminer
simplement la fin de la chaîne manipulée. Par conséquent, le caractère NUL (‘\0’) est interdit
au sein d’une chaîne de caractères.

Exemple de chaînes de caractères :

"CLAVIER" chaîne de caractère de longueur 8 : 7 caractères significatifs + le caractère NUL.

"a3(\1\n" chaîne de caractère de longueur 6 : 5 caractères significatifs + le caractère NUL.

Attention :

‘A’ et "A" sont deux littéraux distincts : le premier représente le caractère A et occupe une seule
case mémoire de type « char » tandis que le second représente la chaîne de caractère A qui
occupe deux cases mémoires de type « char » ; l’une pour le caractère A lui-même et l’autre le
caractère NUL.

2.4. Les opérateurs


Les opérateurs peuvent être représentés par un ou deux caractères spéciaux, par un mot réservé
(cas de « sizeof ») ou par un spécificateur de type mis entre parenthèses.

Le langage C définit plusieurs classes d’opérateurs (arithmétiques, logiques, . . . ). Avec plusieurs


opérateurs d’une même classe on peut former des expressions. Pour s’assurer que ces expressions
seront évaluées correctement, il est indispensable de connaître les caractéristiques de chaque
opérateur. On distingue trois caractéristiques:

 L’arité : définit le nombre des opérandes d’un opérateur. On différencie, par exemple,
l’expression « -z » qui utilise un opérateur unaire de l’expression « x-y » où l’on utilise un
opérateur binaire. Ainsi, il existe trois types d’opérateurs :

 Les opérateurs unaires qui précédent un identificateur, une expression ou une constante.
 Les opérateurs binaires qui mettent en relation deux termes ou expressions.
 Un opérateur ternaire qui met en relation trois termes ou expressions.

 L’associativité : décrit l’ordre conventionnel d’évaluation des expressions. Les opérateurs


binaires sont en général associatifs à gauche ainsi l’expression « x+y+z » sera évaluée de
gauche à droite comme « (x+y)+z ». Les opérateurs unaires eux, sont en général associatifs
à droite.
 La précédence : ou priorité relative; c’est encore une convention qui permet de déterminer
quels sont les opérateurs utilisés en premier lors de l’évaluation d’une expression. Par
exemple l’opérateur multiplication « * » est traditionnellement prioritaire sur l’opérateur
addition « + » et l’expression « x+y*z » est évaluée comme « x+(y*z) ». Pour des
3 Chapitre 1 : Eléments de base du langage C
Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

opérateurs différents mais de même précédence, on utilise l’associativité, ainsi dans


« x/y*z », les opérateurs diviser « / » et multiplier « * » ont la même priorité mais sont
associatifs à gauche on évalue donc cette dernière expression comme: « (x/y)*z ».

Ces propriétés sont regroupées dans le tableau récapitulatif ci-dessous pour tous les opérateurs du
langage. Ils sont classés selon leur précédence par ordre décroissant : des plus prioritaires au moins
prioritaires.

Opérateurs: Associativité:
( ) [ ] -> . (primaires) gauche
! ~ (complément à 1) ++ - - + (unaire) - (unaire) (type) droite
* (référençage) & (déréférençage) sizeof
* (multiplication) / % gauche
+ (binaire) - (binaire) gauche
<< >> (décalage) gauche
< <= > >= (relationnel) gauche
== != gauche
& (et bit à bit) gauche
^ (ou exclusif bit à bit) gauche
| (ou bit à bit) gauche
&& gauche
|| gauche
?: droite
= (et les dérivés += -= *= /= %= &= ^= |= >>= <<=) droite
, gauche

2.4.1. Opérateurs arithmétiques


Ces opérateurs s’appliquent aux types numériques (entiers, réels).

Opérateurs unaires + - associatifs à droite


Opérateurs binaires + - * / tous associatifs à gauche
dont l’opérateur modulo %
Les priorités sont les suivantes, on applique d’abord les + et - unaires, ensuite les *, / et % et
enfin les + et - binaires.

Attention :

 L’opérateur modulo « % » ne s’applique qu’aux types entiers.


 L’opérateur division « / » effectue une division entière si les deux opérandes sont des
entiers et effectue une division réelle si au moins une des opérandes est un réel.

2.4.2. Opérateurs relationnels


Ces opérateurs s’appliquent à tous les types prédéfinis et aux types énumérés qui sont
équivalents à des entiers.

Opérateurs de comparaisons < <= >= > associatifs à gauche


Opérateurs égalité, inégalité == != associatifs à gauche

4 Chapitre 1 : Eléments de base du langage C


Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

Les priorités sont les suivantes on applique d’abord les <= , >= , < , > puis les == et !=

Remarque :

Pour les types énumérés, l’ordre, du plus petit au plus grand, pour les valeurs possible est celui de
la déclaration.

Attention :

 Le type booléen n’existe pas dans le C ANSI (C89) ; les opérateurs de relation fournissent
les valeurs 0 (zéro) ou 1 (un) (respectivement « faux » et « vrai »), de type « int » (entier).
 La forme == est source d’erreur(s) fréquente(s), un seul caractère = (opérateur
d’affectation) ne provoquera pas, en général, une erreur de syntaxe mais le code risque
de donner un résultat faux.
 L’application de ces opérateurs à des chaînes de caractères nécessite des précautions et
ne donnera pas forcément le résultat escompté.

2.4.3. Opérateurs logiques


Le langage C ANSI (C89) ne possède pas de type booléen. Les opérateurs logiques s’appliquent
donc à des types numériques de préférence entiers. Est considérée comme vrai toute valeur non
nulle (même négative) et la valeur 0 correspond donc à faux.

Opérateurs unaire ( négation) ! associatif à droite


Opérateurs binaires (et, ou) && || associatifs à gauche
Les priorités sont les suivantes, on applique d’abord la négation ! puis la && et enfin ||

Remarque :

L’opérateur négation convertit donc à 0 toute valeur non nulle et à 1 une valeur nulle.

Propriété :

Les opérateurs « && » et « || » «court-circuitent» l’évaluation des expressions ainsi dans


l’expression « AA && BB », si « AA » est fausse alors « AA && BB » est aussi fausse et l’expression
« BB » n’est pas évaluée et n’a pas besoin d’être définie. De même dans l’expression « AA || BB »
si « AA » est vraie alors « AA || BB » est aussi vraie et l’expression BB n’est pas évaluée et, de
même, peut ne pas être définie. Un exemple:

int n,p,q ;

if (n !=0 && p/n==q)

Ici, si n vaut zéro (n==0), l’expression « p/n » ne sera (heureusement) pas évaluée.

Attention :

 Toujours utiliser des variables de type entier dans les expressions logiques (comparer à
zéro une variable réelle est toujours hasardeux);

5 Chapitre 1 : Eléments de base du langage C


Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

2.4.4. Opérateurs de logique binaire


Ces opérateurs agissent sur des chaînes de bits et sont intéressants pour des manipulations
d’information élémentaire plutôt «proches de la machine». Ils s’appliquent à des variables de
type caractère ou de type entier.

Opérateur unaire (complément à 1) ~ associatif à droite


Opérateurs de décalage (droite, gauche) >> << associatifs à gauche
Opérateurs binaires (bit à bit) & | ^ associatifs à gauche
et , ou , ou exclusif
Les priorités sont les suivantes, on applique le complément à 1 « ~ » puis « >> », « << » puis « & »
puis « ^ » et enfin « | ».

2.4.5. Opérateurs d’incrémentation et de décrémentation


L’opérateur d’incrémentation « ++ » (respectivement de décrémentation « -- ») additionne 1
(respectivement soustrait 1) à la variable dont il est associé. Il existe deux syntaxes possibles pour
chacun de ces opérateurs :

 « x++ » (resp. « x-- ») en forme préfixée, qui équivaut à « x = x + 1 » (resp. « x = x - 1 »),


 « ++x » (resp. « --x ») en forme suffixée, qui équivaut à « x = x + 1 » (resp. « x = x – 1 »).

Si la valeur de x, après l'évaluation de l'instruction x++ ou ++x est toujours le successeur de x, il y a


néanmoins une subtilité concernant la valeur de retour de l'instruction, selon la forme utilisée ;
L'une est la valeur avant incrémentation, l'autre est la valeur après incrémentation :

 « y = x++ ; » équivaut à « y = x ; x = x + 1 ; »
 « y = ++x ; » équivaut à « x = 1 + x ; y = x ; »

2.4.6. Les opérateurs d’affectation


L’affectation peut être utilisée pour des types prédéfinis, et les types construits par l’utilisateur:
les types énumérés, les structures, les unions mais pas pour des tableaux. L’affectation « = » est
en langage C un véritable opérateur qui renvoie comme valeur celle de sa partie gauche, ainsi
l’instruction « y = x + (z = 5) ; » est une instruction tout à fait licite. Elle se décompose en « z = 5 ; »
suivie de « y = x + z ; ». En tant qu’opérateur, l’assignation a une priorité inférieure aux autres
opérateurs (sauf « , »). Ainsi, dans l’exemple ci-dessus, les parenthèses « (z=5) » est obligatoire.
En général, il est conseillé d’éviter ce type d’instructions; qui réalisent ce que l’on appelle un effet
de bord. Cette instruction qui vise à modifier la variable y modifie aussi la variable z.

Attention :

 Écrire « if (a=b) ... » au lieu de « if (a==b) ... » n’est pas une erreur c’est
simplement équivalent à: « a=b; » suivi de « if (a)... ».
 la manipulation de chaînes de caractères et petite anticipation, l’affectation de variables
de type structure ou union qui contiennent des variables de type pointeur doit être
effectuée avec précautions. L’assignation ne donnera pas forcément le résultat attendu.
 En langage C, il est possible de composer l’affectation avec certains opérateurs afin
d’optimiser le code machine généré : « x = x <Op> <Expr> » devient « x <Op> = <Expr>.

6 Chapitre 1 : Eléments de base du langage C


Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

2.5. Les séparateurs


Les séparateurs peuvent être constitués d’un ou plusieurs caractères d’espacement (espace /
blanc), d’un ou plusieurs caractères de tabulation (TAB) et du caractère retour à la ligne (nouvelle
ligne). Ces caractères servent à délimiter les unités syntaxiques.

3. Les types de base du langage C


Trois types de base seulement sont décrits dans le langage:

i. Le type caractère: « char »

char c = ‘a’ ;
char ch = ‘\n’ ;
Les constantes s’écrivent entre simples quottes. Des caractères spéciaux peuvent être
utilisés, par exemple: ‘\n’, la fin de ligne; ‘\t’, la tabulation; ‘\0’, le caractère null; ’\\’, le
caractère \ lui même, etc. . .
ii. Le type entier: « int »

int i = 57 ;
int j = i*3 ;
iii. Les types réels: simple précision « float » ou double précision « double ». L’exposant, pour
les constantes réelles, est précédé de e.

float x = -0.25f ;
double y = 1.27e+56 ;

Les «modificateurs»

Il existe aussi la possibilité d’ajouter un attribut applé aussi modificateur, ce sont « signed » (signé,
valeur par défaut), « unsigned » (entier ou caractère non signé), « short » (entier court) et « long »
(entier double longueur ou réel double précision). Par exemple:

long int i; /*ou*/ long ii; /*entiers long*/


short int j; /*ou*/ short jj; /* entier court*/
unsigned int k; /*ou*/ unsigned kk; /*entier non signe, toujours positif*/

On peut bien sûr combiner ces notations, par exemple:

unsigned long lp; /*entier long non signé*/ unsigned short cp ; /*entier court non
signé*/

Remarques :

 L’attribut « long » s’applique aussi aux types réels, « float » et « double ». Un « long float »
est tout simplement un « double ».
 Enfin, lorsque l’on définit des constantes, il peut être nécessaire de préciser leur type. Ainsi,
par défaut les constantes entières sont de type int. Suivies de l ou L elles sont de type long,
suivies de u ou U elles sont de type unsigned. Par défaut, les constantes réelles sont de type
double, suivies de f ou F elles sont de type float, suivies de l ou L elles sont de type long
double.
7 Chapitre 1 : Eléments de base du langage C
Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

Opérateur taille :

Le langage C offre l’opérateur prédéfini « sizeof » qui permet de connaître la place occupée en
mémoire de l’opérande qui lui est associé. « sizeof » retourne une valeur entière. L’unité est la taille
occupée par une variable de type caractère (char), généralement un octet. Cette fonction permet
d’écrire des programmes indépendants des caractéristiques de la machine cible; elle s’avère très
utile pour les problèmes de gestion mémoire.

Exemple :

int i ;
printf("sizeof(i) donne la valeur %d\n",sizeof(i) );
printf("sizeof(short) donne la valeur %d\n",sizeof(short) );
printf("sizeof(long) donne la valeur %d\n",sizeof(long) );
printf("sizeof(char) donne la valeur %d\n",sizeof(char) );

Conversions de Type :

Dans des expressions ou des instructions, le compilateur C peut être amené à effectuer certaines
conversions lors des évaluations pour obtenir un code exécutable correct. Par exemple, le fragment
de code qui suit est correct mais nécessite une conversion implicite:
int i,j,k ;

float x ;
x = i ; /* les operandes ne sont*/
j = k+x ; /* pas du meme type */

La norme C ANSI (C89) spécifie très précisément la façon dont ces instructions seront traitées:

 Cas des expressions: on applique, dans l’ordre, aux opérandes, les règles suivantes:
a) Les « float » sont convertis en « double », les « char » et les « short » en « int ».
b) Si l’un des opérandes d’un opérateur binaire est de type double alors le second est
converti en double.
c) Si l’un des opérandes d’un opérateur binaire est de type long alors le second est converti
en long.
d) Si l’un des opérandes est de type unsigned alors le second est converti en unsigned.

Le résultat de l’évaluation de l’expression est alors de même type que les opérandes après
conversion(s) éventuelle(s).

 Cas de l’affectation: l’expression de droite est évaluée puis convertie dans le type de
l’opérande de gauche.

Si l’on reprend l’exemple précédent, pour effectuer « j = k+x; » :

1) La variable « x » (de type « float ») est convertie en « double ».


2) La variable « k » (de type « int ») est converti en « double ».
3) Le résultat de type « double » de l’addition est converti en « int » et affecté à « j ».

8 Chapitre 1 : Eléments de base du langage C


Enseignant : Mohamed Bécha Kaâniche
Module : Langage C – Programmation C
Année Universitaire : 2015-2016

Il est clair que la valeur finale de « j » dépend du moment précis où ont lieu ces conversions. On peut
forcer une conversion de type, la syntaxe est la suivante: « (type) <expression> ». Après évaluation
de l’« <expression> », le résultat est converti dans le type « type ».

Par exemple dans le fragment de code qui suit, il n’y a plus de conversion implicite:
int i,j,k ;
float x ;

x = (float) i;
j = k + (int) x;

« j = k + (int) x; » n’est donc pas évalué comme le « j = k+x; » précédent, ici x est
d’abord converti en « int » et il n’y a pas d’autre conversion. Le résultat ne sera pas forcément le
même.

Remarque :

Les expressions réelles sont donc toutes évaluées en mode double précision. Ceci est compatible
avec le fait qu’une constante réelle soit, par défaut, de type double.

Attention :

Toutes les conversions ne sont pas possibles et elles se font éventuellement avec perte
d’information(s). Se méfier tout particulièrement des conversions de « float » ou « double » en
« int ».

Annexe – Travaux pratiques n°1


Exercice 1 :
Ecrire un programme qui affiche les tailles de tous les types de bases de la norme C ANSI (C89).

Exercice 2 :
Ecrire un programme qui saisit deux réels « x » et « y » et affiche les résultats de leurs divisions l’un
par l’autre : « x/y » et « y/x » et de la division euclidienne de leurs parties entières : « E(x)/E(y) », «
E(x)%E(y) », « E(y)/E(x) » et « E(y)%E(x) ».

Exercice 3 :
Ecrire un programme retournant la factorielle d’un nombre entier entré par l’utilisateur.

Exercice 4 :
Ecrire un programme qui résout les équations du second degré (ax2 + bx + c = 0).
Le programme demande « a », « b » et « c » à l’utilisateur puis indique le nombre de solutions ainsi
que leurs valeurs.

Exercice 5 :
Ecrire un programme retournant le PGCD ainsi que le PPCM de 2 entiers entrés par l’utilisateur.

9 Chapitre 1 : Eléments de base du langage C

Vous aimerez peut-être aussi