Vous êtes sur la page 1sur 5

Université Mohammed VI Polytechnique Année : 2020-2021

TIUF Structures de données

TYPES DE BASE ET OPÉRATEURS DE C

Le C est un langage typé. Cela signifie en particulier que toute variable, constante ou
fonction est d’un type précis. Le type d’un objet donné est trés important dans la mesure
où il précise la manière dont cet objet est stocké en mémoire.
La mémoire de l’ordinateur est constituée d’une suite continue d’octets. Chaque octet
de la mémoire est caractérisé par son adresse qui est un nombre entier. Deux octets qui
se suivent ont des adresses qui se suivent. Lorsqu’une variable est déclarée, une zone
mémoire lui est réservée. La longueur de cette zone mémoire est déterminée par le type
de la variable et l’architecture de la machine dans laquelle est implanté le compilateur.
L’adresse de la variable déclarée est alors celle du premier octet à partir duquel la zone
mémoire résérvée commence.

1. La notion de type
L’ordinateur, compte tenu de sa technologie (actuelle !), ne sait représenter et traiter
que des informations exprimées sous forme binaire. Toute information, quelle que soit sa
nature, devra être codée sous cette forme. Dans ces conditions, on voit qu’il ne suffit pas
de connaı̂tre le contenu d’une zone mémoire (d’un ou de plusieurs octets) pour être en
mesure de lui attribuer une signification.
Par exemple, si on sait qu’un octet contient le ”motif binaire” 01001101 on peut penser à
plusieurs possibilités. Par exemple, cela pourrait représenter le nombre entier 77 puisque
le motif ci-dessus correspond à la représentation en base 2 de ce nombre.
Mais pourquoi cela représenterait-il un nombre entier ? En effet, toutes les informa-
tions (nombres entiers, nombres réels, caractères, instructions de programme en langage
machine, graphiques, . . . ) devront, au bout du compte, être codées en binaire. Dans
ces conditions, les huit bits ci-dessus peuvent tout aussi bien représenter le caractère M
puisque son code ASCII est 01001101.
On comprend donc qu’il n’est pas possible d’attribuer une signification à une information
binaire tant qu’on ne connat pas la manière dont elle a été codée. La notion de type sert
à régler, entre autres choses, les problèmes que nous venons d’évoquer.
Les types de base du langage C se répartissent en trois grandes catégories en fonction de
la nature des informations qu’ils permettent de représenter.
• nombres entiers (mot clé int),
• nombres réels (mot clé float),
• caractères (mot clé char).

L’opérateur sizeof permet de connaitre le taille, en octets, de chaque type. L’instruction


printf("%d", sizeof(int));
permet par exemple d’afficher le nombre d’octets aloués au type int.

Date: November 3, 2020.


1
2 TYPES DE BASE ET OPÉRATEURS DE C

1.1. Le type void. Comme son nom l’indique, void est le type vide. Il a été introduit
par la norme ANSI pour préciser les fonctions sans argument ou sans retour.
1.2. Le type entier. Le mot clé int correspond à la représentation de nombres entiers
relatifs. Ils sont codés dans la machine de la façon suivante : le premier bit est réservé
pour représenter le signe du nombre (0 correspond un nombre positif); les autres bits
servent à représenter la valeur absolue du nombre.
Le type int peut recevoir des qualificatifs pour préciser sa taille. On distingue les qual-
ificatifs short, long et unsigned. Par exemple, long int x; permet de déclarer un entier
(d’identificateur x) et de type entier long. La longueur allouée (nombre d’octets) dépend
du compilateur. Si la longueur allouée à un long int est de 4 octets, cela couvre des
valeurs allant de -2 147 483 648 à 2 147 483 647.
Le qualificatif unsigned est utile lorsqu’on a affaire à des entiers positifs. Dans ce cas le
bit du signe est récupéré, ce qui permet de représenter des entiers positifs de taille plus
grande.
1.3. Le type flottant. Le type flottant permet de représenter, de manière approchée,
des nombres réels. La manière dont ce type est codé en machine s’inspire de la notation
scientifique, ou exponentielle, qui consiste à écrire un nombre sous la forme 1.5.1022 ou
0.472.10−8 . Dans une telle notation, on nomme mantisse les quantités telles que 1.5 ou
0.472 et exposant les quantités telles que 22 ou −8.
Le C prévoit trois types de flottants : float, double et long double. La différence entres
ces types réside dans le nombre d’octets aloués, donc dans la précision à représenter les
nombres réels.
1.4. Le type caractère. Le type char concerne les lettres (majuscules et minuscules), les
chiffres, les signes de ponctuation et les différents séparateurs. Mais la notion de caractère
en C dépasse celle de caractère imprimable, c’est-à-dire affichable sur un écran. Il existe
en effet certains “caractères” de contrôle tels que le changement de ligne, la tabulation,
l’activation d’une alarme sonore, . . . .
Il y a aussi une liste de caractères imprimables, tels que les caractères \ et ”, qui jouent un
rôle particulier de délimiteurs en C, ce qui les empêche d’être notés de manière classique.
1.5. Notation des constantes caractère. Les constantes qui sont du type char sont
notées entre apostrophes ou cotes (’c’, ’1’, ’+’ par exemple). Voici la liste des caractères
ayant une écriture non standard.

NOTATION ABREVIATION

\a Cloche ou bip sonore


\b Retour arrière
\f Saut de page
\n Saut de ligne
\r Retour chariot
\t Tabulation horizontale
\v Tabutation verticale
\\ \
\0 0

\” ”
\? ?
TYPES DE BASE ET OPÉRATEURS DE C 3

Une des particularités du type char est qu’il peut être assimilé à un entier. Tout objet
de type char peut être utilisé dans une expression qui utilise des objets de type int. Si
par exemple une variable c est de type char, l’expression c + 1 est valide et elle désigne le
caractère suivant dans le code ASCII.

2. Opérateurs et expressions
Le langage C est certainement l’un des langages les plus fournis en opérateurs. En plus
des opérateurs classiques (arithmétiques, relationnels et logiques), il y en a des moins
classiques (manipulations de bits). Mais, de surcroı̂t, le C dispose d’un important éventail
d’opérateurs originaux d’affectation et d’incrémentation.
2.1. L’affectation. En C, l’affectation est un opérateur à part entière. Sa syntaxe est la
suivante.
variable = expression;
Le terme de gauche peut être une variable de type simple, un élement de tableau, mais
surtout pas une constante. Cette instruction a pour effet d’évaluer la quatité expression
et d’affecter le résultat à variable.
L’affectation efféctue une conversion automatique de type : c’est à dire la valeur de ex-
pression est automatiquement convertie dans le type de la quantité variable. Par exem-
ple, le programme suivant
#include<stdio.h>

int main()
{
int i, j=2;
double x=2.5;
i=j+x;
x=x+i;
printf("%lf", x);
return 0;
}
affichera pour x la valeur 6.5 au lieu de 7. Ceci est dû au fait que l’instruction i=j+x;
convertit l’expression j+x dans le type int.
2.2. Les opérateurs arithmétiques. Comme tous les langages, C dispose de l’opérateur
unaire de chagement de signe (-), et des opérateurs binaires

+ addition,
− soustraction,
∗ mupltiplication,
/ division,
% reste de la division euclidienne.
Ces opérateurs agissent sur les entiers et les flottants de la manière habituelle. Leurs seules
spécificités sont les suivantes.
• Le C dispose uniquement de / pour désigner à la fois la division entière et la
division entre flottants. Si les deux opérandes sont de type entier le résultat est
une division entière. Par contre si l’un des opérandes est un flottant le résultat est
un division de flottants.
4 TYPES DE BASE ET OPÉRATEURS DE C

• L’opérateur % ne s’applique qu’au type entier.

Notons enfin qu’il n’existe pas d’opérateur de puissance. Une telle opération s’éffectue à
l’aide de la fonction pow(x, y) de la librairie math.h.

2.3. Les opérateurs relationnels. Ce sont les prédicats standards de la vie courante
qui servent à comparer des quantités.

> supérieur,
>= supérieur ou égal,
< inférieur,
<= inférieur ou égal,
== égal,
!= différent.

Leur syntaxe est


expression1 opérateur expression2 ;
Les deux expressions sont évaluées et ensuite comparées. Le résultat rendu est de type
booléen, et vaut 1 si la condition est vraie et 0 sinon.

3. Les opérateurs logiques booléens


Là aussi, il s’agit d’opérateurs standard. Seule la manière de noter change.

&& le ET logique,
|| le OU logique,
! la NEGATION logique.
Comme pour les opérateurs de comparaison, la valeur retournée est un booléen qui vaut
1 si la condition est vraie et 0 sinon. La syntaxe s’écrit
expression1 opérateur1 expression2 . . . opérateurn−1 expressionn ;
L’évaluation d’une telle instruction se fait de gauche à droite, et s’arrête dès que le résultat
final est déterminé. Par exemple dans
int i;
int t[10];
if ((i>=0) && i<=9 && t[i]==0)
la troisième condition ne sera pas vérifiée si i n’est pas entre 0 et 9.

3.1. L’opérateur conditionnel ternaire. L’opérateur conditionnel “?” est un opérateur


ternaire, sa syntaxe s’écrit
condition ? expression1 : expression2 ;

Elle signifie qu’on prend expression1 si la condition est satisfaite, alors qu’on prend
expression2 sinon. Par exemple, l’instruction
x>= 0 ? x : -x;
correpond à la valeur absolue de x.
TYPES DE BASE ET OPÉRATEURS DE C 5

3.2. L’opérateur de conversion de type. On l’appelle cast, et il sert à modifier ex-


plicitement le type d’un objet. Sa syntaxe s’écrit
(type) objet;
int main()
{
int i=3, j=2;
printf("%lf", (double)i/j);
return 0;
}
affiche la valeur 1.5.
3.3. L’opérateur adresse. L’opérateur d’adresse & s’applique à une variable et retourne
son adresse-mémoire. La syntaxe est
& identificateur;
Son utilité sera clarifiée lorsqu’on abordera les pointeurs.
3.4. Les opérateurs d’affectation composée. Les opérateurs d’affectation composée
sont
+ =, − =, ∗ =, / =, % =
Pour tout opérateur op l’instruction
expression1 op = expression2 ;
est équivalente à
expression1 = expression1 op expression2 ;
3.5. Les opérateurs d’incrémentation et de décrémentation. Les opérateurs d’incrémentation
++ et de décrémentation −− peuvent être utilisés en suffixe (i++, i−−) ou en préfixe
(++i,−−i). Dans les deux cas la variable sera incrémentée, toutefois dans la notation
suffixe la valeur retournée sera l’ancienne valeur de la variable alors que dans la notation
prefixée c’est la nouvelle valeur qui est retournée. Par exemple,
int i=2,j,k;
j=++a; /* i vaut 3 et j vaut 3*/
k=j++; /* k vaut 3 et j vaut 4*/

Vous aimerez peut-être aussi