Você está na página 1de 19

C (langage)

Aller : Navigation, rechercher Pour les articles homonymes, voir C. C Apparu en Auteur Dveloppeur Paradigme Typage 1972 Dennis Ritchie Dennis Ritchie & Bell Labs Programmation imprative, procdurale, structure statique, faible ANSI X3.159-1989 (ANSI C, C89) ISO/CEI 9899:1990 (C90) ISO/CEI 9899:1999 (C99) ISO/IEC 9899:2011 (C11) ALGOL 60 travers CPL, BCPL, puis B awk, csh, C++, C#, ObjC, BitC, D, Concurrent C, Java, JavaScript, PHP, Perl...

Normes

Influenc par A influenc

Implmentations GCC, MSVC, Borland C, Watcom C


modifier

Le C est un langage de programmation impratif, gnraliste, traditionnellement utilis en programmation systme. Invent au dbut des annes 1970 avec UNIX, C est devenu un des langages les plus utiliss. De nombreux langages plus modernes comme C++, Java et PHP reprennent des aspects de C.

Sommaire

1 Caractristiques gnrales o 1.1 Qualits et dfauts 2 Histoire o 2.1 Normalisations 3 lments du langage o 3.1 Sources o 3.2 Syntaxe 3.2.1 Hello world o 3.3 Mots cls o 3.4 Instructions du prprocesseur o 3.5 Types o 3.6 Commentaire o 3.7 Structures de contrle o 3.8 Comportements ambigus 3.8.1 Comportements laisss au choix de l'implmentation 3.8.2 Comportements indfinis

4 Bibliothques logicielles o 4.1 La bibliothque standard o 4.2 Les bibliothques externes 5 Des sources l'excutable o 5.1 Prcompilation o 5.2 Compilation o 5.3 Assemblage o 5.4 dition de liens o 5.5 Optimiseurs o 5.6 Environnements de dveloppement 6 Exemples o 6.1 Chanes de caractres o 6.2 Allocation mmoire 7 Rfrences 8 Voir aussi o 8.1 Articles connexes o 8.2 Bibliographie o 8.3 Liens externes

Caractristiques gnrales
C est un langage de programmation impratif et gnraliste. C est qualifi de langage de bas niveau dans le sens o chaque instruction du langage est conue pour pouvoir tre compile en un nombre d'instructions machine assez prvisible en termes d'occupation mmoire et de charge de calcul. Il propose un ventail de types entiers et flottants conus pour pouvoir correspondre directement aux types supports par le processeur. Il fait en outre un usage intensif de la notion de pointeur. Il a une notion de type compos, mais ne propose aucune opration qui traite directement des objets de plus haut niveau (fichier informatique, chane de caractres, liste). Ces types plus volus doivent tre traits en manipulant des pointeurs et des types composs. De mme, le langage ne propose pas en standard la gestion de la programmation oriente objet, ni de systme de gestion d'exceptions. Il existe des fonctions standards pour grer les entres-sorties et les chanes de caractres, mais contrairement d'autres langages, aucun oprateur spcifique pour amliorer l'ergonomie. Ceci rend ais le remplacement des fonctions standards par des fonctions spcifiquement conues pour un programme donn. Ces caractristiques en font un langage privilgi quand on cherche matriser les ressources utilises, le langage machine gnr par les compilateurs tant relativement prvisible et parfois mme optimal sur les machines d'architecture RISC grand nombre de registres. Ce langage est donc extrmement utilis dans des domaines comme la programmation embarque sur microcontrleurs, les calculs intensifs, l'criture de systmes d'exploitation et tous les modules o la rapidit de traitement est importante. Il constitue une bonne alternative au langage d'assemblage dans ces domaines, avec les avantages d'une syntaxe plus expressive et de la portabilit du code source. Le langage C a t invent pour crire le systme d'exploitation UNIX, et reste utilis pour la programmation systme. Ainsi le noyau de grands systmes d'exploitation comme Windows et Linux sont dvelopps en grande partie en C.

En contrepartie, la mise au point de programmes en C, surtout s'ils utilisent des structures de donnes complexes, est plus difficile qu'avec des langages de plus haut niveau. En effet, dans un souci de performance, le langage C impose l'utilisateur de programmer certains traitements (libration de la mmoire, vrification de la validit des indices sur les tableaux) qui sont pris en charge automatiquement dans les langages de haut niveau. C tant un langage simple, son compilateur l'est galement. Cela se ressent au niveau du temps de dveloppement d'un compilateur C pour une nouvelle architecture de processeur : Kernighan et Ritchie estimaient qu'il pouvait tre dvelopp en deux mois car on s'apercevra que les 80 % du code d'un nouveau compilateur sont identiques ceux des codes des autres compilateurs existant dj. 1.

Qualits et dfauts
C'est un des langages les plus utiliss car :

il existe depuis le dbut des annes 1970, il est fond sur un standard ouvert, de nombreux informaticiens le connaissent, des compilateurs et bibliothques logicielles existent sur la plupart des architectures ; il a influenc de nombreux langages plus rcents dont C++, Java et PHP, sa syntaxe en particulier est largement reprise ; il met en uvre un nombre restreint de concepts, ce qui facilite sa matrise et l'criture de compilateurs simples et rapides ; il ne spcifie pas rigidement le comportement du fichier excutable produit, ce qui aide tirer parti des capacits propres chaque ordinateur ; il permet l'criture de logiciels qui n'ont besoin d'aucun support l'excution (ni bibliothque logicielle ni machine virtuelle), au comportement prdictible en temps d'excution comme en consommation de mmoire vive, comme des noyaux de systme d'exploitation et des logiciels embarqus.

Ses principaux inconvnients sont :

la premire version du langage (K&R C) offre particulirement peu de vrifications lors de la compilation, et il n'offre aucune vrification pendant l'excution, ce qui fait que des erreurs qui pourraient tre automatiquement dtectes lors du dveloppement ne le sont que plus tard, souvent au prix d'un plantage du logiciel ; il ne facilite pas le dveloppement de concepts informatiques plus modernes comme la programmation oriente objet ou la gestion d'exceptions qui exigent un effort de rigueur supplmentaire de la part du dveloppeur. il est difficile d'crire des programmes portables car le comportement exact des excutables dpend de l'ordinateur cible ; le support de l'allocation de mmoire et des chanes de caractres est minimaliste, ce qui oblige les programmeurs s'occuper de dtails fastidieux et sources de bugs ; il n'y a notamment pas de ramasse-miettes standard ; des bugs communs comme le dbordement de tampon constituent une faille de scurit informatique et peuvent tre exploits par des logiciels malveillants si le dveloppeur ne fait pas attention. plusieurs genres d'erreurs ne peuvent tre dtectes automatiquement qu' l'aide d'outils supplmentaires et non standardiss, comme lint puis splint.

Histoire

Kenneth Thompson ( gauche) et Dennis Ritchie ( droite). Le langage C est apparu au cours de l'anne 1972 dans les Laboratoires Bell. Il tait dvelopp en mme temps que UNIX par Dennis Ritchie et Ken Thompson. Ken Thompson avait dvelopp un prdcesseur de C, le langage B, qui est lui-mme inspir de BCPL. Dennis Ritchie a fait voluer le langage B dans une nouvelle version suffisamment diffrente pour qu'elle soit appele C. Par la suite, Brian Kernighan aida populariser le langage. Il procda aussi quelques modifications de dernire minute. En 1978, il fut notamment le principal auteur du livre The C Programming Language dcrivant le langage enfin stabilis ; Ritchie s'tait occup des appendices et des exemples avec Unix. On parle encore de C K&R, K&R C en anglais (pour Kernighan and Ritchie C) lorsqu'on se rfre au langage tel qu'il existait cette poque.

Normalisations
Invent au dbut des annes 1970, le langage a t compltement dcrit pour la premire fois en 1978 dans le livre The C Programming Language de Brian Kernighan et dennis Ritchie. On appelle gnralement C traditionnel ou K&R C cet ancien dialecte du langage. En 1983, l'Institut national amricain de normalisation (ANSI) a form un comit de normalisation du langage qui a abouti en 1989 l'approbation de la norme dite ANSI C ou C89 (formellement ANSI X3.159-1989). En 1990, cette norme a galement t adopte par l'Organisation internationale de normalisation (C ISO, formellement ISO/CEI 9899:1990). ANSI C est une volution du C K&R qui reste extrmement compatible. Elle reprend quelques ides de C++. En 1995, le groupe de travail de l'ISO a publi deux correctif et un amendement C89. Ces changements assez modestes sont parfois appels C89 avec amendement 1, ou C952. En 1999, une nouvelle volution du langage est normalise par l'ISO : C99 (formellement ISO/CEI 9899:1999). Parmi les ajouts, on notera les tableaux dynamiques, ainsi que des fonctionnalits (types complexes, mot-clef restrict , directives agissant sur la simplification des instructions arithmtiques) souhaitables pour les calculs numriques intensifs, domaine habituel de FORTRAN. En 2011, l'ISO ratifie une nouvelle version3 du standard : C11, formellement ISO/IEC 9899:2011.

lments du langage
Sources
L'usage est de donner l'extension de nom de fichier .c aux fichiers source C. En outre, des fichiers permettant de partager les interfaces, portent le mme nom, avec l'extension (suffixe) .h (h pour header en anglais, soit en-tte en franais). Chaque fichier .c est compil sparment. Les rles des fichiers .c et .h sont rpartis ainsi :

Les fichiers .c contiennent l'implmentation des fonctions et variables globales. Les fichiers .h contiennent uniquement des dclarations de type, de fonctions, de macros, de variables globales, etc. Lorsqu'un fichier .c ou .h utilise un identificateur dclar dans un autre fichier .h, alors il inclut ce dernier fichier. Le principe gnralement appliqu consiste crire un fichier .h pour chaque fichier .c, et dclarer dans le fichier .h tout ce qui est export du fichier .c.

Syntaxe
La syntaxe de C a t conue pour tre brve. Historiquement, elle a souvent t compare celle de Pascal, langage impratif galement cr dans les annes 1970. Voici un exemple avec une fonction factorielle :
/* En C (norme ISO) */ int factorielle(int n) { if (n > 1) return n * factorielle(n - 1); else return 1; } { En Pascal } function factorielle(n: integer) : integer begin if n > 1 then factorielle := n * factorielle(n - 1) else factorielle := 1 end.

On constate que l o Pascal utilise des mots cls comme function, begin, end et then, C utilise des parenthses et accolades. Hello world Programme Hello world propos en exemple en 1978 dans The C Programming Language de Brian W. Kernighan et Dennis M. Ritchie :
#include <stdio.h> main() { printf("hello, world\n"); }

Le mme programme, conformment la norme ISO :

#include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } #include <stdio.h>

inclut l'en-tte standard <stdio.h>, contenant les dclarations des fonctions d'entre-sortie de la bibliothque standard de C. main est le nom de la fonction principale, aussi appele point d'entre du programme. int est le type renvoy par la fonction main. Le type int est implicite en K&R C et en C89, mais plus en C99. Le mot cl void entre les parenthses signifie que la fonction main ne prend aucun paramtre. Les accolades { et } entourent les instructions constituant le corps de la fonction main. printf est une fonction d'criture dans la sortie standard (la console par dfaut). Le caractre " dlimite une chane de caractres ; "hello, world\n" dans ce cas. Un point-virgule ; termine toute instruction. L'instruction return 0; indique que la fonction retourne la valeur 0.

Crer un programme affichant Hello World est depuis devenu l'exemple de rfrence pour prsenter les bases d'un nouveau langage.

Mots cls
auto, break, case, char, const (C89), continue, default, do, double, else, enum (C89), extern, float, for, goto, if, inline (C99), int, long, register, restrict (C99), return, short, signed (C89), sizeof, static, struct, switch, typedef, union, unsigned, void (C89), volatile (C89), while, _Bool (C99), _Complex (C99), _Imaginary

(C99)4. Les termes ci-dessus sont rservs pour tre exploits en tant que mots cls, et ne doivent pas tre utiliss autrement.

Instructions du prprocesseur
#include, #define, #pragma (C89), #if, #ifdef, #ifndef, #elif #undef, #line, #warning, #error.

(C89), #else, #endif,

Types
Le langage C comprend de nombreux types de nombres entiers, occupant plus ou moins de bits. La taille des types n'est que partiellement standardise : le standard fixe uniquement une taille minimale et une magnitude minimale. Les magnitudes minimales sont compatibles avec d'autres reprsentations binaires que le complment deux, bien que cette reprsentation soit presque toujours utilise en pratique. Cette souplesse permet au langage d'tre efficacement adapt des processeurs trs varis, mais elle complique la portabilit des programmes crits en C.

Chaque type entier a une forme signe pouvant reprsenter des nombres ngatifs et positifs, et une forme non signe ne pouvant reprsenter que des nombres naturels. Le type char, gnralement utilis pour reprsenter un caractre, est un type entier comme les autres, si ce n'est que, selon l'implmentation, il quivaut signed char ou unsigned char. Types entiers, en ordre croissant Magnitude signed Magnitude unsigned (magnitude minimale exige (magnitude minimale exige par le standard5) par le standard5) 0 255 (0xFF en hexadcimal not avec le prfixe 0x de la syntaxe de C)

Type
char, unsigned char, signed char

Taille

8 bits

-127 127

(C89)
short

(identique
signed short), unsigned short int (identique signed int), unsigned int long (en)

16 bits

-32 767 +32 767

0 65 535 (0xFFFF)

16 bits (taille d'un -32 767 +32 767 mot machine)

0 65 535 (0xFFFF)

(identique
signed long), unsigned long long long

32 bits

-2 147 483 647 +2 147 483 647

0 4 294 967 295 (0xFFFFFFFF)

(identique
signed long long), unsigned long long

64 bits

-9 223 372 036 854 775 807 +9 223 372 036 854 775 807

0 18 446 744 073 709 551 615 (0xFFFFFFFFFFFFFFF)

(C99) Le type enum est un type numr. Il existe des types de nombres virgule flottante, de prcision, donc de longueur en bits, variable ; en ordre croissant : Types dcimaux, en ordre croissant Type Prcision Magnitude float 6 chiffres dcimaux environ 10-37 10+37 double 10 chiffres dcimaux environ 10-37 10+37 long double 10 chiffres dcimaux environ 10-37 10+37

long double

(C89) 10 chiffres dcimaux

C99 a ajout float complex, double complex et long double complex, reprsentant les nombres complexes associs. Types labors :
struct, union, * pour les [ ] pour les tableaux ; ( ) pour les fonctions.

pointeurs ;

Les versions du langage antrieures C99 ne proposent pas de type boolen, mais il est possible d'en dfinir un :
enum boolean {false, true}; typedef enum boolean bool;

ou, en version condense :


typedef enum boolean {false, true} bool;

partir de C99, il existe le type _Bool.

Commentaire
Dans les versions de C antrieures C99, les commentaires devaient commencer par une barre oblique et un astrisque ( /* ) et se terminer par un astrisque et une barre oblique. Tout ce qui est compris entre ces symboles est du commentaire, saut de ligne compris :
/* Ceci est un commentaire sur deux lignes ou plus */

La norme C99 a ajout la possibilit de faire des commentaires sur une seule ligne, de la mme manire quen C++ :
// Commentaire comme en C++, valable jusqu' la fin de la ligne

Structures de contrle
La syntaxe des diffrentes structures de contrle existantes en C est largement reprise dans plusieurs autres langages, comme le C++ bien sr, mais galement Java, C#, PHP ou encore JavaScript. Les trois grands types de structures sont prsents :

les tests (galement appels branchements conditionnels) avec :


o if (expression) instruction else if (expression) instruction else instruction

switch (expression) instruction,

avec case et default dans

l'instruction les boucles avec :


o o o while (expression) instruction for (expression_optionnelle ; expression_optionnelle ; expression_optionnelle) instruction do instruction while (expression) break continue return expression_optionnelle goto tiquette

les sauts (branchements inconditionnels) :


o o o o

Comportements ambigus
Comportements laisss au choix de l'implmentation La norme du langage C laisse la dfinition exacte du comportement de plusieurs oprations au choix du concepteur du compilateur. Ces comportements sont donc dfinis par l'implmentation. Cette proprit de C permet au compilateur d'utiliser directement les instructions proposes par le processeur, donc de compiler des programmes excutables courts et efficaces. En contrepartie, c'est parfois la cause de bugs de portabilit des codes source crits en C. Prenons pour exemple6 la division entire d'un nombre ngatif : -5 / 3. Alors que Fortran, Pascal et Ada spcifient un rsultat de -1, et que Modula-3 spcifie un rsultat de -2, C7 garantit simplement que la valeur absolue du reste est strictement infrieure la valeur absolue du diviseur8. La seule garantie dans cet exemple est donc que le rsultat sera compris entre -2 et 0. Pour le programmeur et l'efficacit de C, le plus important est sans doute le fait que les tailles des types de donnes de base ne doivent respecter que des garanties minimales. Ainsi, le type int correspondant au mot machine peut avoir une taille de 16 bits sur un processeur 16 bits et une taille de 64 bits sur un processeur 64 bits. Voir le paragraphe Types pour les dtails. Comportements indfinis En C, des constructions syntaxiquement valables ont un comportement lors de l'excution compltement indfini. Outre la classique division par zro, on peut signaler l'affectation multiple d'une variable dans la mme expression, avec l'exemple9 :
i = i++; /* Comportement indfini. */

Les meilleurs compilateurs dclent certaines constructions problmatiques et peuvent les signaler, mais aucun ne prtend l'exhaustivit.

Bibliothques logicielles
La bibliothque standard
Article dtaill : Bibliothque standard du C.

La bibliothque standard normalise, disponible avec toutes les implmentations, prsente la simplicit lie un langage bas-niveau. Voici une liste de quelques en-ttes dclarant des types et fonctions de la bibliothque standard :
<assert.h> : pour un diagnostic de conception lors de l'excution (assert) <ctype.h> : tests et classification des caractres (isalnum, tolower) <errno.h> : gestion minimale des erreurs (dclaration de la variable errno) <math.h> : fonctions mathmatiques de base (sqrt, cos) ; nombreux ajouts en <signal.h> : gestion des signaux (signal et raise) <stddef.h> : dfinitions gnrales (dclaration de la constante NULL) <stdio.h> : pour les entres/sorties de base (printf, scanf) <stdlib.h> : fonctions gnrales (malloc, rand) <string.h> : manipulation des chanes de caractres (strcmp, strlen) <time.h> : manipulation du temps (time, ctime)

C99

La bibliothque standard normalise n'offre aucun support de l'interface graphique, du rseau, des entres/sorties sur port srie ou parallle, des systmes temps rel, des processus ou des threads, ou encore de la gestion avance des erreurs (comme avec des exceptions structures). Cela pourrait restreindre d'autant la portabilit pratique des programmes qui ont besoin de faire appel certaines de ces fonctionnalits, sans l'existence de trs nombreuses bibliothques portables et palliant ce manque ; dans le monde UNIX, ce besoin a aussi fait merger une autre norme, POSIX.1.

Les bibliothques externes


Le langage C tant un des langages les plus utiliss en programmation, de nombreuses bibliothques ont t cres pour tre utilises avec le C. Frquemment, lors de l'invention d'un format de donnes, une bibliothque ou un logiciel de rfrence en C existe pour manipuler le format. C'est le cas pour libjpeg, libpng, Expat, les dcodeur de rfrence MPEG, etc.

Des sources l'excutable


La gnration d'un excutable, partir des fichiers sources se fait en plusieurs tapes, qui sont souvent automatises l'aide d'outils comme :

make SCons (crit en Python) ou bien encore des outils spcifiques l'environnement de dveloppement intgr (EDI) utilis.

Les tapes menant des sources au fichier excutable sont au nombre de quatre : prcompilation, compilation, assemblage, dition de liens.

Prcompilation
Durant cette tape, le prprocesseur effectue plusieurs oprations sur les fichiers sources, dont les instructions (les directives du prprocesseur) sont au sein mme de ces fichiers. Le

prprocesseur produit alors des fichiers intermdiaires (qui ont gnralement l'extension .i ) pour chaque fichier source, qui seront utiliss dans l'tape suivante. Le prprocesseur effectue des remplacements de textes, des inclusions de fichiers (gnralement les fichiers d'en-ttes contenant diverses dclarations) avec la possibilit d'effectuer certaines oprations uniquement si certaines conditions sont remplies. C'est galement durant cette tape que les commentaires sont supprims.

Compilation
Article dtaill : Compilateur. La phase de compilation consiste gnralement en la gnration du code assembleur (encore lisible par un tre humain, mais dpendant du processeur). Pour chaque fichier source, on obtient un fichier en langage d'assemblage. Cette tape est divise en trois sous-tapes, qui sont :

l'analyse lexicale, qui est la reconnaissance des mots cls du langage l'analyse syntaxique, qui analyse la structure du programme et sa conformit avec la norme l'criture d'un code isomorphe celui de l'assembleur (et parfois du code assembleur lui-mme quand cela est demand en option du compilateur)

Par abus de langage, on appelle compilation toute la phase de gnration d'un fichier excutable partir des fichiers sources. Mais c'est seulement une des tapes menant la cration d'un excutable. Certains compilateurs C fonctionnent ce niveau en deux phases, la premire gnrant un fichier compil dans un langage intermdiaire destin une machine virtuelle idale (voir PCode) portable d'une plate-forme l'autre, la seconde convertissant le langage intermdiaire en langage d'assemblage dpendant du processeur utilis sur la plate-forme cible. D'autres compilateurs C permettent de ne pas gnrer de langage d'assemblage, mais seulement le fichier compil en langage intermdiaire, qui sera interprt ou compil automatiquement en code natif l'excution sur la machine cible (par une machine virtuelle qui sera lie au programme final).

Assemblage
Cette tape consiste en la gnration d'un fichier objet pour chaque fichier de code assembleur. Ces fichiers objet sont en langage machine. C'est un format binaire, dpendant du processeur. Les fichier objets sont gnralement dextension .o sous Unix ou Linux, ou .obj avec les outils de dveloppement pour plates-formes Microsoft, Intel, Digital, IBM : DOS, Windows, VMS, CP/M o les extensions se prsentent usuellement sous la forme de trois caractres. Cette phase est parfois regroupe avec la prcdente (par tablissement d'un flux de donnes interne sans passer par des fichiers en langage intermdiaire ou langage d'assemblage), dans ce cas le compilateur gnre directement un fichier objet binaire.

Pour les compilateurs qui gnrent du code intermdiaire, cette phase d'assemblage peut aussi tre totalement supprime : c'est la machine virtuelle (lie au programme final, ou utilise sparment comme chargeur du programme excuter sur une machine virtuelle partage et optimise spcialement sur la machine hte) qui interprtera ou compilera ce langage en code machine natif directement sur la machine hte. Dans ce cas, la machine virtuelle qui interprte le langage intermdiaire ou le compile en code natif optimis pour la machine hte, peut tre un composant du systme d'exploitation ou une bibliothque partage installe sur celui-ci, et cette machine virtuelle ne sera mme pas incluse dans le programme final livrable.

dition de liens
L'dition de liens est la dernire tape et a pour but de runir tous les lments d'un programme. Les diffrents fichiers objets sont alors runis, ainsi que les bibliothques statiques, pour ne produire qu'un fichier excutable. Le but de l'dition de liens est de slectionner les lments de code utiles prsents dans un ensemble de codes compils et de bibliothques, et de rsoudre les rfrences mutuelles entre ces diffrents lments afin de permettre ceux-ci de se rfrencer directement l'excution du programme.

Optimiseurs
Des essais de comparaison entre le C et l'assembleur effectus depuis 1990 sur des machines RISC montrent, de faon tout fait contre-intuitive, un net avantage au C lorsque toutes les options d'optimisation du compilateur sont actives. Les optimiseurs construisent en effet un graphe chromatique qui leur permet d'allouer sans se tromper les usages de registres de faon quasi-optimale, l o un programmeur serait vite perdu. Ils regroupent de plus directement les instructions en rarrangeant les chargements et sauvegardes de registres pour bnficier de l'effet pipeline. La mme opration effectue sur un programme source serait envisageable, mais le rendrait quasi impossible ensuite maintenir. En revanche, les optimiseurs ont moins de latitude concernant la rorganisation d'instructions CISC, plus complexes, et dans ce cas prcis les rsultats sont moins tranchs.

Environnements de dveloppement
Article dtaill : Environnement de dveloppement intgr.

Exemples
Voici quelques exemples prsentant trs succinctement quelques proprits du C. Pour plus d'information, voir le WikiLivre "Programmation C".

Chanes de caractres
Voici l'exemple de fonction de copie de chane de caractres donn dans The C Programming Language, 2nd edition, p. 106.
void strcpy(char *s, char *t)

{ while (*s++ = *t++) ; }

Le principe est de copier les octets-caractres jusqu' ce que l'on copie le caractre nul, qui marque conventionnellement la fin d'une chane en C. La bibliothque standard de C offre une fonction strcpy similaire, dont le prototype est char *strcpy(char*, const char*). La boucle while utilise une notation classique mais trs brve permise par C, qui a contribu lui donner une rputation de langage peu lisible. L'expression *s++ = *t++ copie un caractre, retourne sa valeur, et incrmente les pointeurs s et t. Cette boucle n'a pas de corps, car toutes les oprations sont effectues dans l'expression de test du while. On considre qu'il faut matriser ce genre de notation pour matriser C10.

Allocation mmoire
La structure int_list reprsente un lment d'une liste chane, contenant des donnes de type int. Les deux fonctions qui suivent (insert_next et remove_next) servent ajouter et supprimer un lment de la liste.
/* La gestion de la mmoire n'est pas intgre au langage mais assure par des fonctions de la bibliothque standard. */ #include <stdlib.h> /* Permet de typer fortement le code la compilation */ typedef struct int_list int_list; struct int_list { int_list* next; /* pointeur sur l'lment suivant */ int value; /* valeur de l'lment */ }; /* * Ajouter un lment la suite d'un autre. * node : lment aprs lequel ajouter le nouveau * value : valeur de l'lment ajouter * Retourne : adresse de l'lment ajout, ou NULL en cas d'erreur. */ int_list* insert_next(int_list* node, int value) { /* Allocation de la mmoire pour un nouvel lment. */ int_list* const new_next = malloc(sizeof(int_list)); /* Si l'allocation a russi, alors insrer new_next entre node et node->next. */ if (new_next) { new_next->next = node->next; node->next = new_next; new_next->value = value; } return new_next; }

/* * Supprimer l'lment suivant un autre. * node : lment dont le suivant est supprim */ void remove_next(int_list* node) { int_list* const node_to_remove = node->next; /* Retire l'lment suivant de la liste. */ node->next = node->next->next; /* Libre la mmoire occupe par l'lment suivant. */ free(node_to_remove); }

Dans cet exemple, les deux fonctions essentielles sont malloc et free. La premire sert allouer de la mmoire, le paramtre qu'elle reoit est le nombre de bytes que l'on dsire allouer et elle retourne l'adresse du premier byte qui a t allou, sinon elle retourne NULL. free sert librer la mmoire qui a t alloue par malloc.

Rfrences
Brian Kernighan et Dennis Ritchie (trad. Thierry Buffenoir), Le langage C [ The C Programming Language ] [dtail des ditions], p. 4 2. (en), Samuel P. Harbison III, Guy L. Steel Jr., A Reference Manual, fifth edition, Upper Saddle River, Prentice Hall, 2002, p. 4, (ISBN 0-13-089592-X) 3. http://www.iso.org/iso/fr/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 [archive] 4. ISO/IEC 9899:TC3, Section 6.4.1: Keywords [archive], International Organization for Standardization JTC1/SC22/WG14, 2007-09-07 5. a et b Sizes of integer types , ISO-IEC 9899, 5.2.4.2.1 6. donn dans Computer Architecture, a Quantitative Approach, 2e dition, de David A. Patterson et John L. Hennessy, Appendix A-12 7. La rvision en 1999 de la norme spcifie explicitement que le rsultat soit -1 [6.5.5 alina 6]. 8. (en) Brian Kernighan et Dennis Ritchie, The C Programming Language [dtail des ditions], p. 205 9. (en) comp.lang.c FAQ list Question 3.3 [archive] 10. (en) Brian Kernighan et Dennis Ritchie, The C Programming Language [dtail des ditions], p. 106 1.

Voir aussi
Sur les autres projets Wikimedia :

La programmation en C, sur Wikiversity Le langage C, sur Wikibooks

Articles connexes

Bibliothque standard du C Alignement de donnes International Obfuscated C Code Contest

Quelques programmes clbres crits en C


UNIX La suite de compilateurs GNU Compiler Collection (GCC) Le noyau Linux

Le noyau de Microsoft Windows GNOME

Bibliographie

(en) Brian Kernighan et Dennis Ritchie, The C Programming Language [dtail des
ditions]

The international standardization working group for the programming language C, o (en) ISO/IEC 9899:TC2 WG14/N1124, Committee Draft , 6 mai 2005 [lire en ligne] Le dernier brouillon de la norme ISO C99 incluant le Technical Corrigendum 2
o

(en) ISO/IEC 9899:TC3 WG14/N1256, Committee Draft , 7 septembre 2007 [lire en ligne] Le dernier brouillon de la norme ISO C99 incluant le Technical Corrigendum 3

(en)Ivor Horton, Beginning C, Apress, 2006, (ISBN 978-1-59059-735-4) Jean-Michel Lry, Le langage C, Pearson Education, 2005, (ISBN 978-2-7440-7086-0) Achille Braquelaire, Mthodologie de la programmation en C, Dunod, 2005 [dtail de ldition], (ISBN 978-2-10-049018-9) Claude Delannoy, Programmer en langage C - Cours et exercices corrigs, Eyrolles, 11e tirage - 2006, (ISBN 978-2-212-11072-2) Mathieu Nebra, Apprenez programmer en C - 2e dition, dition Site du Zro 2009, (ISBN 979-1090085008) Eric Bertomier et Daniel Schang, Le C en 20 heures, Co-dition InLibroVeritas et FramaBook - 2010, (ISBN 978-2-35922-030-8)

Liens externes

(fr) Catgorie Langage C de lannuaire dmoz

[masquer]
vdm

Langages de programmation
Langages objets Langages impratifs Langages ActionScript AppleScript C++ C# CoffeeScript D Delphi Eiffel Groovy Java JavaScript Lisaac Logo Objective-C Python Ruby Scala Simula Smalltalk Visual Basic APL ASP Assembleur BASIC BCPL Shell Unix C COBOL Natural Forth Fortran Limbo Lua Modula-2 NQC NXC OPL Pascal Perl PHP PL/I Tcl Windows PowerShell WLangage Haskell Lisp/Common Lisp ML/OCaml/F# Opa Scheme XSLT

fonctionnels Langages Clips Prolog dclaratifs Langages Ada Erlang concurrents Voir aussi : Conception Codage Tests Optimisations

Portail de la programmation informatique

Catgories :

Langage C Langage de programmation Norme ISO

| [+]

Crer un compte Connexion Article Discussion Lire Modifier Afficher l'historique

Accueil Portails thmatiques Index alphabtique Article au hasard Contacter Wikipdia

Contribuer

Premiers pas Aide Communaut Modifications rcentes Faire un don

Imprimer / exporter Bote outils Autres langues

Afrikaans Alemannisch Aragons Asturianu Azrbaycanca emaitka Brezhoneg Bosanski Catal M ng-d ng-ng Corsu esky Cymraeg Dansk Deutsch English Esperanto Espaol Eesti Euskara Suomi Gaeilge Galego Hrvatski Magyar Interlingua Bahasa Indonesia slenska Italiano Basa Jawa Taqbaylit

Kurd Latina Lietuvi Latvieu Malagasy Bahasa Melayu Nederlands Norsk nynorsk) Norsk bokm l) Occitan Polski Portugus Romn Srpskohrvatski / Simple English Slovenina Slovenina Shqip / srpski Svenska Tagalog Trke /tatara Ting Vit Winaray Bn-lm-g

Dernire modification de cette page le 26 novembre 2012 19:49. Droit d'auteur : les textes sont disponibles sous licence Creative Commons paternit partage lidentique ; dautres conditions peuvent sappliquer. Voyez les conditions dutilisation pour plus de dtails, ainsi que les crdits graphiques. En cas de rutilisation des textes de cette page, voyez comment citer les auteurs et mentionner la licence. Wikipedia est une marque dpose de la Wikimedia Foundation, Inc., organisation de bi

Você também pode gostar