Utilisateur:Regards sur sciences/C
Apparence
À 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>.
Traits généraux
[modifier | modifier le wikicode]- 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
[modifier | modifier le wikicode]- Types entiers signés int8_t, int32_t et int64_t, types entiers non signés uint8_t, uint32_t et uint 64_t. Lorsque la spécification d'une taille précise pour le type n'apporte rien à l'exercice, on utilise les types signé in-t et non signé unsigned int. Opérations arithmétiques +, —, I, *. Opération 'h 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 char sert exclusivement à représenter des caractères codés sur un octet. Notation '\O' pour le caractère nul.
- Type double (on considère qu'il est sur 64 bits). Opérations
- Type bool et les constantes true et f aise. Opérateurs ! , &&, 11 (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 cons-t type c = y. On n'utilise pas la directive du préprocesseur #define à cette fin.
Types structurés
[modifier | modifier le wikicode]- Tableaux statiques: déclaration par type T[s] où s est une constante littérale entière. Lecture et écriture d'un terme de tableau par son indice T[i] ; 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 {type1 champ1; ... type, champ,,; } et ensuite typedef 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 u. champ ainsi que u-> 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 strl en, strcpy, strcat.
Structures de contrôle
[modifier | modifier le wikicode]- Conditionnelle if (c) 5T' if (c) 5T else SJ.
- Boucle while (c) s; boucle for (mit; fin; incr) s, possibilité de définir une variable dans mit; break.
- Définition et déclaration de fonction, passage des paramètres par valeur, y compris des pointeurs. Casparticuliers: passage de paramètre de type tableau, simulation de valeurs de retour multiples.
Pointeurs et gestion de la mémoire
[modifier | modifier le wikicode]- 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 malloc et sizeof (on peut présenter size_t pour cet usage mais sa connaissance n'est pas exigible). Libération avec f ree.
- Transtypage de données depuis et vers le type vo id* dans l'optique stricte de l'utilisation de fonctions comme mal loc.
- En particulier: gestion de tableaux de taille non statiquement connue; linéarisation de tels tableaux quand ils sont multidimensionnels.
Divers
[modifier | modifier le wikicode]- Utilisation de asser-t lors d'opérations sur les pointeurs, les tableaux, les chaînes.
- Flux standard.
- Utilisation élémentaire de printf et de scanf. 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 //
Traits généraux et divers
[modifier | modifier le wikicode]- Utilisation de #define, #ifndef et #endif lors de l'écriture d'un fichier d'en-tête pour rendre soninclusion 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 uninitialisateur{t0, t1, ..., t_}.
- Définition d'une valeur de type structure par un initialisateur { . c1 = y1, . c2 = y2, • . . }.
- Compilation séparée.
Gestions des ressources de la machine
[modifier | modifier le wikicode]- Gestion de fichiers: f open (dans les modes r ou w), f close, fscanf, fprintf avec rappel de la syntaxe de formatage.
- Fils d'exécution: inclusion de l'entête pthread.h, type pthread_t, commandes pthread_create avec attributs par défaut, pthread_j oin sans récupération des valeurs de retour.
- Mutex: inclusion de l'entête pthread . h, type pthread_mutex_t, commandes pthread_mutex_lock, pthread_mutex_unlock, pthread_mutex_destroy.
- Sémaphore: inclusion de l'entête semaphore . h, type sem_t, commandes sem_init, sem_destroy, sem_wait, sem_post.