Académique Documents
Professionnel Documents
Culture Documents
Attention :
les identificateurs,
les mots-clés,
les littéraux,
les opérateurs,
les séparateurs.
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.
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 ».
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).
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.
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.
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
Attention :
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é.
Remarque :
L’opérateur négation convertit donc à 0 toute valeur non nulle et à 1 une valeur nulle.
Propriété :
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);
« y = x++ ; » équivaut à « y = x ; x = x + 1 ; »
« y = ++x ; » équivaut à « x = 1 + x ; y = x ; »
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>.
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:
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.
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 ».
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.