Les données qu'utilise un programme peuvent varier au cours de son exécution. On les appelle alors des variables. Les valeurs de ces variables peuvent être modifiées au moyen d'une série d'opérations. Toute variable utilisée par le programme doit posséder un type. En déclarant la variable, on précise donc le type de valeur qu'elle va contenir. Toute déclaration de variable doit être de la forme :
nom_du_type_de_la_variable nom_de_la_variable;
Remarque : |
int i;
|
est équivalent à |
int i,j;
|
Identificateur deType |
Exemples |
Nom de l'Identificateur de Type |
|
-5, 0, 13 |
|
|
-15.9, 0.03, 3.1416 |
|
|
'A', '#', 's' |
|
Ce type représente les données entières. La déclaration d'une variable entière doit être sous la forme :
int nom_de_la_variable;
C permet aussi de préciser si les entiers doivent être de types longs (long int) ou de types courts (short int). Ces extensions permettent de choisir les valeurs maximales et minimales que peuvent contenir les variables.
Type |
int |
long int |
unsigned int |
unsigned long int |
Minimum |
-32768 |
-2147483648 |
0 |
0 |
Maximum |
32767 |
2147483647 |
65535 |
4294967295 |
int
n,p; /*n et p sont des nombres entiers*/
long int
taille; /*taille est un nombre du type long int*/
unsigned int
vitesse_de_la_lumiere; /*vitesse_de_la_lumiere est
un nombre du type unsigned int*/
unsigned long
int infini; /*infini
est un nombre du type unsigned long int*/
Ce type représente les données numériques réelles. La déclaration d'un tel type de variables sera de la forme :
float nom_de_la_variable;
Il y a également comme pour les entiers une extension de type float, il s'agit du type double.
Type |
float |
double |
Minimum |
-3.4E+38 |
-1.7E+308 |
Maximum |
3.4E+38 |
1.7E+308 |
Le type double permet une plus grande précision.
float
PI; /*pi est un nombre décimal*/
double
micro; /*micro est un nombre du type double*/
C permet d'utiliser des variables caractères. La déclaration d'une variable caractère doit être de la forme :
char nom_de_la_variable;
Les valeurs possibles pour ce type de variable correspondent aux caractères ASCII. Nous pouvons remarquer qu'une valeur caractère doit toujours être entourée par des apostrophes ' '.
Exemple :
char lettre;
/* on définit "lettre" comme étant de type
caractère*/
lettre='A';
/* on affecte à "lettre" le symbole A,
on remarque les apostrophes*/
2 fonctions utiles :
La fonction
getchar()
Cette fonction lit un caractère unique. La valeur
renvoyée par la fonction correspond au caractère lu.
caractere_lu=getchar;
Exemple :
char caractere;
caractere=getchar();
La fonction
putchar
Cette fonction écrit un caractère. Son format est
le suivant :
putchar(item);
où item est une variable de type caractère ou un valeur caractère.
Exemple :
char caractere;
caractere='a';
putchar(caractere);
putchar('b');
Exemple utilisant getchar et puchar :
main()
{
char carlu; /*définition
d'une variable char pour stocker le caractère lu */
printf("Entrez
la lettre a.\n");
printf("Validez
votre saisie par <Entree> :");
carlu=getchar();
/* lecture du caractère "a" via getchar
et affectation du caractère à la variable "carlu" */
putchar('\n');
/* saut de ligne via la séquence '\n' */
putchar(97);
/* affichage de la lettre "a" via son code ASCII
*/
putchar('\n');
/* saut de ligne */
putchar('a');
/* affichage de la lettre "a" en tant que constante */
}
Déroulement de ce programme :
Entrez la lettre a.
Validez votre saisie par <Entree> : a
a
a
a
Il est possible d'assigner une valeur à une variable à l'aide du signe =. On peut le faire de deux manières différentes : soit lors de la déclaration de la variable, soit après ces déclarations.
Exemples :
#include<stdio.h>
main()
{
int a=3,
b=5, c; /*
on assigne les valeurs 3 et 5 aux variables a et b lors de leur déclaration,
et rien à c */
float x=1.23,
y;
char lettre='z';
printf ("Ici a vaut 3, b vaut 5 et on ne sait pas combien vallent c et y");
a=6;
b=8;
c=6;
y=-23.32;
printf ("Ici a vaut 6, b vaut 8, c vaut
6 et y vaut -23.32");
}
Si mathématiquement les entiers constituent un sous-ensemble des nombres
fractionnaires, on ne saurait dire la même chose des int,
par rapport aux float.
Ces deux types représentent en fait, informatiquement, deux ensembles
disjoints.
Par exemple, le nombre 1 avec le type int est
différent du nombre 1 avec le type float.
Si on veut associer, en une même opération arithmétique un int
et un float, il est nécessaire que
les deux opérandes aient un type commun. On atteint ce type commun à partir
d'une conversion généralement implicite.
Expression mixte
Les opérateurs arithmétiques ne sont définis que lorsque leurs deux opérandes sont de même type. Mais on peut écrire ce que l'on nomme des "expressions mixtes" dans lesquelles interviennent des opérandes de types différents.
Exemple :
n * x + p (avec n et p de type int et x
de type float)
Dans ce cas, le compilateur sait, compte tenu des règles de priorité,
qu'il doit d'abord effectuer le produit n*x. Pour que ce soit possible,
il va convertir n dans le type float (car on considère que le type float
permet de représenter un int, l'inverse étant faux). La multiplication
portera donc sur deux opérandes de type float et
elle fournira un résultat de type float. Pour
l'addition, on se retrouve à nouveau en présence de deux opérandes de types
différents. Le même mécanisme sera mis en place et, le résultat final sera
de type float.
n * x
+ p
| |
|
int float int
| |
|
float | |
| * |
|
--------- |
| |
float float
| +
|
--------------
|
float
Conversions implicites
Dans l'affectation, la valeur de l'expression à droite du signe égal est convertie, avant affectation, selon le type de la variable réceptrice située à gauche du signe égal.
Exemple :
main()
{
int n;
float x=2.1;
n=x+5.3; /* le compilateur calcule d'abord x+5.3,
puis convertit le */
/* résultat (qui est 7.4) en un entier : on a
donc n=7 */
}
Conversions explicites
L'opérateur cast permet toutes les conversions explicites, ayant un sens.
Syntaxe :
(type) donnee_a_convertir
Exemple :
main()
{
int i=10,j=3; /* i et j sont un entier */
double x; /* x doit recevoir la valeur
de i/j */
x= (double) (i/j);
/* x a pour valeur l'expression entière i/j convertie
en double */
/* Il y a d'abord calcul dans le type int de i/j : ici le résultat */
/* est 3, puis ce résultat est convertit en double. x=3.0 */
x= (double) i/j;
/* i est d'abord convertit en double, les règles
de conversions */
/* implicites font que j est convertit en double également, puis */
/* vient le calcul de i/j : ici le résultat est donc de 3.3333... */
/* Et enfin, ce résultat est mis dans x : x=3.33333... */
}
Les opérateurs de cette catégorie procèdent à des opérations arithmétiques sur leurs opérandes. Outre les opérateurs de calculs élémentaires, il existe un opérateur de changement de signe, et un opérateur pour calculer le reste entier d'une division (modulo).
L'opérateur | En C | Exemple | Renvoie |
x PLUS y | x+y | 5+2 | 7 |
x MOINS y | x-y | 5-2 | 3 |
x FOIS y | x*y | 5*2 | 10 |
x DIVISE PAR y | x/y | 10/5 | 2 |
x MODULO y | x%y | 5%2 | 1 |
MOINS x | -x | -(-2) | 2 |
Les opérateurs de comparaison en C font partie des opérateurs binaires et comparent les valeurs de leurs opérandes. Ils testent, ce faisant, la nature de la relation entre les deux opérandes. Le résultat d'une comparaison est, d'un point de vue logique, une assertion de type VRAI ou FAUX.
Remarque :
un entier est estimé VRAI si sa valeur
est différente de 0, FAUX si elle vaut 0.
L'opérateur | En C | Exemple 1 | Renvoie | Exemple 2 | Renvoie |
x EGAL y | x= =y | (3= =(2+1)) | VRAI | (5= =(2+1)) | FAUX |
x DIFFERENT de y | x!=y | (5!=(2+1)) | VRAI | (3!=(2+1)) | FAUX |
x INFERIEUR OU EGAL A y | x<=y | (3<=3) | VRAI | (3<=2) | FAUX |
x SUPERIEUR OU EGAL A y | x>=y | (5>=5) | VRAI | (5>=7) | FAUX |
x INFERIEUR A y | x<y | (3<5) | VRAI | (5<5) | FAUX |
x SUPERIEUR A y | x>y | (2>1) | VRAI | (3>3) | FAUX |
Les opérateurs logiques en C effectuent les opérations classiques de la logique des prédicats : ET (AND), OU (OR), NON (NOT). Grâce à eux, il est possible de relier logiquement des instructions. Il y a trois opérateurs logiques, deux d'entre eux sont binaires, et l'autre est unaire. Comme avec les opérateurs relationnels, l'évaluation des expressions comportant des opérateurs logiques donne un résultat de type VRAI, FAUX, exprimé en tant que grandeur de type int. Ce résultat peut prendre les valeurs 0 (FAUX) ou 1 (VRAI).
Remarque :
un entier est estimé VRAI si sa valeur
est différente de 0, FAUX si elle vaut 0.
L'opérateur | En C | Exemple 1 | Renvoie | Exemple 2 | Renvoie |
x ET y | x&&y | (3<5)&&(5>2) | VRAI | (3==5)&&(5>3) | FAUX |
x OU y | x||y | (3<5)||(5<2) | VRAI | (3==5)||(5<3) | FAUX |
NON x | !x | !(3>5) | VRAI | !(5>3) | FAUX |
Ces opérateurs, semblables aux opérateurs logiques, permettent de réaliser des opérations sur les bits de données. Outre les opérations logiques ET, OU, NON, sur les bits, on peut également effectuer des opérations de décalage. Toutes opérations de bits exigent des opérandes entiers.
L'opérateur | En C | Exemple 1 | Renvoie |
x ET y | x&y; | 110&011 | 010 |
x OU y | x|y; | 110|011 | 111 |
x OU EXCLUSIF y | x^y; | 110^011 | 101 |
Complément à 1 de x | ~x; | ~110 | 001 |
Décalage de x, de y bits vers la droite | x>>y; | 11011001>>3 | 00011011 |
Décalage de x, de y bits vers la gauche | x<<y; | 11011001<<3 | 11001000 |
L'affectation des entiers est l'opération la plus fondamentale de tout langage de programmation. Cette opération est matérialisée par le signe "=". La valeur qui se trouve à la droite de ce signe est mise dans la variable située à sa gauche. Elle constitue également la valeur résultat de l'expression.
Exemple :
A=2; /*
on affecte ici 2 à la variable A */
B=A+3;
/* on affecte ici 5 (car A+3=5) à la variable B */
Les affectations combinées mélangent une opération d'affectation avec une opération arithmétique ou logique.
Façon 1 | est équivalent à | Façon 2 |
x++; | est équivalent à | x=x+1; |
x--; | est équivalent à | x=x-1; |
x+=y; | est équivalent à | x=x+y; |
x-=y; | est équivalent à | x=x-y; |
x*=y; | est équivalent à | x=x*y; |
x/=y; | est équivalent à | x=x/y; |
x%=y; | est équivalent à | x=x%y; |
x>>=y; | est équivalent à | x=x>>y; |
x<<=y; | est équivalent à | x=x<<y; |
x&=y; | est équivalent à | x=x&y; |
x|=y; | est équivalent à | x=x|y; |
x^=y; | est équivalent à | x=x^y; |