Langage C
Programme de MP2I/MPI
La présente annexeliste limitativement les éléments du langage C (norme C99 ou plus récente) dont la connaissance,
selon les modalités de chaque sous-section, est exigible des étudiants à la fin de la première année. Ces
éléments s’inscrivent dans la perspective de lire et d’écrire des programmes en C; aucun concept sous-jacent
n’est exigible au titre de la présente annexe.
À l’écrit, on travaille toujours sous l’hypothèse que les entêtes suivants ont tous été inclus <assert.h>,
<stdbool.h>,<stddef.h>,<stdint.h>,<stdio.h>,<stdlib.h>. Mais ces fichiers ne font pas en soi l’objet
d’une étude et aucune connaissance particulière des fonctionnalités qu’ils apportent n’est exigible.
Traits et éléments techniques à connaître
Les éléments et notations suivants du langage C doivent pouvoir être compris et utilisés par les étudiants sans faire l’objet d’un rappel, y compris lorsqu’ils n’ont pas accès à un ordinateur.
Traits généraux
- Typage statique. Types indiqués par le programme lors de la déclaration ou définition.
- Passage par valeur.
- Délimitation des portées par les accolades.Les retours à la ligne et l’indentation ne sont pas signifiants mais sont nécessaires pour la lisibilité du code.
- Déclaration et définition de fonctions, uniquement dans le cas d’un nombre fixé de paramètres.
- Gestion de la mémoire : pile et tas, allocation statique et dynamique, durée de vie des objets.
Définitions et types de base
-
Types entiers signés
int8_t,int32_tetint64_t, types entiers non signésuint8_t,uint32_tetuint64_t. Lorsque la spécification d’une taille précise pour le type n’apporte rien à l’exercice, on utilise les types signéintet non signéunsigned int. Opérations arithmétiques+,-,/,*. Opération%entre opérandes positifs. Ces opérations sont sujettes à dépassement de capacité. À l’écrit, on élude les difficultés liées à la sémantique des constantes syntaxiques. On ne présente pas les opérateurs d’incrémentation. -
Le type
charsert exclusivement à représenter des caractères codés sur un octet. Notation'\0'pour le caractère nul. - Type
double(on considère qu’il est sur 64 bits). Opérations+,-,*,/. - Type
boolet les constantestrueetfalse. Opérateurs!,&&,||(y compris évaluation paresseuse). Les entiers ne doivent pas être utilisés comme booléens, ni l’inverse. - Opérateurs de comparaison
==,!=,<,>,<=,>=. - Les constantes du programme sont définies par const type 𝑐 =𝑣. On n’utilise pas la directive du préprocesseur #define à cette fin.
Types structurés
- Tableaux statiques : déclaration par type
𝑇[𝑠]où𝑠est une constante littérale entière. Lecture et écriture d’un terme de tableau par son indice𝑇[𝑖]; le langage ne vérifie pas la licéité des accès. Tableaux statiques multidimensionnels. - Définition d’un type structuré par
struct nom _ s { type 1 champ 1 ;... type 𝑛 champ 𝑛;}et ensuitetypedef struct nom _ s nom(la syntaxe doit cependant être rappelée si les étudiants sont amenés à écrire de telles définitions). Lecture et écriture d’un champ d’une valeur de type structure par 𝑣. champ ainsi que 𝑣-> champ. L’organisation en mémoire des structures n’est pas à connaître. - Chaînes de caractères vues comme des tableaux de caractères avec sentinelle nulle. Fonctions
strlen,strcpy,strcat.
Structures de contrôle
- Conditionnelle
if (C) St,if (C) St else Sf. - Boucle
while (C) S; bouclefor ( init ; fin ; incr ) S, possibilité de définir une variable dansinit;break. - Définition et déclaration de fonction, passage des paramètres par valeur, y compris des pointeurs. Cas particuliers : passage de paramètre de type tableau, simulation de valeurs de retour multiples.
Pointeurs et gestion de la mémoire**
- Pointeur vers un objet alloué, notation type
*p = &v. On considère que les pointeurs sont sur 64 bits. - Déréférencement d’un pointeur valide, notation
*p. On ne fait pas d’arithmétique des pointeurs. - Pointeurs comme moyen de réaliser une structure récursive. Pointeur
NULL. - Création d’un objet sur le tas avec
mallocetsizeof(on peut présentersize_tpour cet usage mais sa connaissance n’est pas exigible). Libération avecfree. - Transtypage de données depuis et vers le type
void *dans l’optique stricte de l’utilisation de fonctions commemalloc. - En particulier : gestion de tableaux de taille non statiquement connue; linéarisation de tels tableaux quand ils sont multidimensionnels.
Divers
- Utilisation de
assertlors d’opérations sur les pointeurs, les tableaux, les chaînes. - Flux standard.
- Utilisation élémentaire de
printfet descanf. La syntaxe des chaînes de format n’est pas exigible. - Notion de fichier d’en-tête. Directive
#include "fichier. h". - Commentaires
/* ... */et commentaires ligne//
Éléments techniques devant être reconnus et utilisables après rappel
Les éléments suivants du langage C doivent pouvoir être utilisés par les étudiants pour écrire des programmes dès lors qu’ils ont fait l’objet d’un rappel et que la documentation correspondante est fournie.
Traits généraux et divers
- Utilisation de
#define,#ifndefet#endiflors de l’écriture d’un fichier d’en-tête pour rendre son inclusion idempotente. - Rôle des arguments de la fonction
int main( int argc, char * argv[]); utilisation des arguments à partir de la ligne de commande. - Fonctions de conversion de chaînes de caractères vers un type de base comme
atoi. - Définition d’un tableau par un initialisateur
{𝑡 0 , 𝑡 1 ,..., 𝑡 𝑁−1}. - Définition d’une valeur de type structure par un initialisateur
{.𝑐1 = 𝑣1 , .𝑐2 = 𝑣2 ,...}. - Compilation séparée.
Gestions des ressources de la machine**
- Gestion de fichiers:
fopen(dans les modesrouw),fclose,fscanf,fprintfavec rappel de la syntaxe de formatage. - Fils d’exécution : inclusion de l’entête
pthread.h, typepthread_t, commandespthread_createavec attributs par défaut,pthread_joinsans récupération des valeurs de retour. - Mutex : inclusion de l’entête
pthread.h, typepthread_mutex_t, commandespthread_mutex_lock,pthread_mutex_unlock,pthread_mutex_destroy. - Sémaphore : inclusion de l’entête
semaphore.h, typesem_t, commandessem_init,sem_destroy,sem_wait,sem_post.