Instructions au préprocesseurs (instructions diézé ex : #include #define
etc).
on est parti des langages machines aux langages structurés (C par
exemple).
C est un langage compilé :
le langage machine c’est tout simplement le langage binaire, les directives
que reçoit la machine sont des directives transformées en binaire pour la
machine.
Langage d’assemblage : qui est associé à des assembleurs (transformateur
des instructions du langage donné en binaire).
Les ordinateurs n’ont pas tous exactement le même répertoire
d’instructions machine.
Langage orienté machine : l’emploi de l’assembleur nécessite une bonne
connaissance du fonctionnement de l’ordinateur utilisé.
Langage évolué (orienté problème) : utilisation sur toutes les machines
(ex : langage C).
Langage compilé : traduire l’ensemble d’un programme écrit en langage
évolué (programme source) en un programme machine (programme
objet), la compilation est réalisée par un compilateur. Un programme
objet est directement exécuté par le système d’exploitation (un
exécutable).
Langage interprété : le code peut passer par le compilateur ou pas mais
finit toujours dans l’interpréteur (un agent du SE). Le code n’est pas
transformé en binaire.
Un logiciel est un système (quand il manipule les ressources du système)
ou une application (quand ça se situe sur les hautes couches).
Le langage C est un langage non portable.
Langage structuré : langage utilisant des structures de contrôle.
Langage procédural : langage utilisant des fonctions pour résoudre un
problème.
(antivirus, pilotes, virus, clavier, etc. c’est programmé en C)
C et ses différentes versions :
K&R version de Kermighan et Ritchie (1978)
après le succès de UNIX, normes ANSI (américain)
- version ANSI C (ou C89) en 1989 (norme américaine)
- ISO C ou C90 (norme internationale)
- version plus récentes (C99, C11)
depuis 1999 (C99 la version la plus supportée) il n’y a pas eu de
changement majeur
- Décembre 2011 (adoption de ISO C11)
structures anonymes,
support unicode amélioré,
suppression de gets() : qui ne marche pas par moment
Structure générale d’un programme
le compilateur comprends 3 sous parties : le préprocesseur (il s’occupe des
instructions diézé, ensuite il produit un fichier), le vrai compilateur
(analyse syntactique et sémantique), éditeur de lien (génération de fichier
exécutable).
Inclusion de fichier
#include<stdio.h>
#include<<mon_fic.h>> (on dit à l’environnement où trouver le fichier).
Jeu de caractères
l’Unicode permet de représenter théoriquement tous les langues du monde,
même les caractères qui ne font pas parti du code ASCII.
Jeu de caractère source : l’ensemble des caractères qu’on peut trouver dans
un code source (permettant d’écrire les programme source).
Jeu de caractère d’exécution : l’ensemble des caractère qu’on trouver à
l’exécution (retour à la ligne par exemple).
Jeu de caractère étendu : l’ensemble de tous les caractères pouvant être
utilisés
caractères multi-octets : ANSI C99 définit le type wchar_t permettant de
déclarer des caractères n’appartenant pas au tableau ASCII
les trigraphes
suite de 3 caractères exemple :??=,??(
les identificateurs (on les utilise pour définir les noms des fonctions,
macro-instructions, types, variable, etc)
tout ce qui suit le # est une macro
les 4 catégories d’identificateurs
- les noms d’étiquettes
- les marqueurs de structures, d’unions et d’énumérations
- les noms des membres d’une structure ou d’une union
- les identificateurs ordinaires (tout autre que les 3 premiers)
des identificateurs appartenants à des catégories différentes peuvent être
identiques. Les mêmes noms peuvent être utilisés pour des champs de
structures différentes.
Portée d’un identificateur
en C il existe 4 portées :
- prototype d’une fonction (portée la plus limitée)
- fonction
- bloc
- fichier
la notion de type
le type d’une variable :
- détermine l’espace requis pour le stockage ,
- détermine la façon de coder, d’interpréter
- d’exploiter l’information dans la zone réservée.
Le type d’une fonction : détermine la façon d’interpréter et d’exploiter sa
valeur de retour
nous avons 2types de type :
- les types prédéfinis :
- types de base (entiers, flottantes)
- type void
- types dérivés
Type _Bool
introduit par C99
1= true, 0= false
dans stdbool.h
bool est défini pour _Bool
true et false sont des macros
les constantes défini dans limits.h
CHAR_MIN : la valeur minimal d’un char
SCHAR_MIN : la valeur minimal d’un char signé
UCHAR_MIN : la valeur minimal d’un char non signé
Exercice : Ecrire un programme qui permet d’afficher les valeurs qui se
trouves dans le tableaux des intervalles de valeurs usuels (p48).
De plus le fichier définit les constantes CHAR_BIT et
MB_LEN_MAX pour respectivement désigner le nombre de bits dans un
bytes (8 habituellement) et le nombre maximum d’octets dans un caractère
multi-octets.
Type à taille définie
Introduit en C99
ils sont définis dans stdint.h
intN_t : la taille de la variable est exactement N bits
int_leastN_t : la taille est au moins N bits
int_fastN_t : le type le plus rapide d’une taille d’au moins N bits
intmax_t : le type entier de plus grande taille implémenté
intptr_t : assez grand pour implémenter un pointeur
s’il s’agit de types non signé on rajoute un u
pour les utiliser on inclus stdint.h
constantes définies dans stdint.h
wchar_t, wint_t, size_t on remplace le t par MIN ou MAX
page51 (deimal xol ko)
Type flottants (réels et complexes)
le fichier float.h définit les constantes symboliques qui décrivent tous les
aspects d’une présentation donnée réelle flottante (p56 et 57 démal xoliko
boubaax).
Le type d’une constante est déterminée par 2 choses
- sa valeur
- sa notion (parfois elle seule suffit)
CONSTANTE CARACTERE
tout ce qui se trouve entre des simples cotes sont des caractères (selon le
standard). Même si c’est plusieurs caractères.
Expressions et opérateurs
Expression : suite syntaxiquement correcte d’opérateurs et d’opérande
(f(25) est une expression, les parenthèses représente l’opérateur et le
paramètre correspond à l’opérande).
Lvalue (expression qui désigne une zone mémoire, comme une variable) ,
rvalue (l’ordre d’égalité) l’ordre correcte est lvalue = rvalue
par exemple on ne peut pas faire 5=x mais plutôt x=5. Somme (x,y) et non
(x,y) Somme.
Une expression a un type et une valeur (si le type n’est pas void)
En C l’opérateur % n’est permis que pour les entiers
Du point de vue du nombre de leurs opérandes, on a 3 types d’opérateurs :
- les opérateurs unaires (ont tous la même priorité)
- les opérateurs binaires
- les opérateurs ternaires
Autres opérateurs
- appel de fonction ( ) (ce qui vient avant les parenthèses est un pointeur
- conversion de type, (int)x
x doit être de type scalaire, c’est à dire pointeur ou type arithmétique
- sizeof
- opérateur séquentiel (ou virgule), (a=2,b=7 renvoie 7)
- opérateur ternaire
les opérateurs (and, or, xor etc …) sont définies dans le fichier iso646.h
on peut inclure donc ce fichier pour utiliser ‘and’ au lieu de ‘&&’.
page 86 (maîtrisé le tableau).
Exercice : Afficher le motif binaire d’une valeur sans utiliser l’opérateur
de la division arithmétique, mais en utilisant les opérateurs bit à bit.
Les conversions de type
implicite : effectué automatiquement par le compilateur
explicite : exprimée avec l’aide de l’opérateur de conversion (cast)
page(90) à connaître (relatif aux conversion de type)
les instructions et déclaration
Exercice :
1. #define N 25
2. int f(int x) ;
3. void g( ){…..}
4. int i ;
5. const int i=5 ;
6. #define double(x) 2*(x)
Déclaration : fixer l’interprétation et les propriétés d’un ou de plusieurs
identificateurs en leur associant un type. (prototypes de fonctions,
définitions de type)
Définition : c’est une déclaration qui alloue de l’espace mémoire à un
objet ou une fonction.
Instructions : préciser les actions à effectuer, contrôler le déroulement
d’un programme. Elles sont traitées de façon séquentielle en générale sauf
lorsque l’une d’elles déclenche un saut . Une instruction qui n’est pas un
bloc doit se terminer par un point virgule.
Instruction-expression ( expression suivie de point virgule f(int a); )
page 105 à 115.
classes de mémorisation (sur les variables) : p128
classes d’allocations (
statique : la variable est créée et initialisée une seule fois, avant le début
du programme. Elle existera tout au long de l’exécution.
Automatique : la variable est créée à chaque fois que le programme entre
dans le bloc où elle est définie. lorsque ce bloc fini, la mémoire occupée
par elle est libérée
)
les spécificateurs de classe de mémorisation
auto
register
static
extern