En informatique, C est un langage de programmation impératif.
C'est un des langages les plus utilisés pour plusieurs raisons :
Ses principaux inconvénients sont :
En 1983, l'Institut national américain 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é adoptée par l'Organisation internationale de normalisation (formellement ISO/CEI 9899:1990). ANSI C est une évolution du K&R C qui reste extrêmement compatible. Elle reprend quelques idées de C++.
En 1999, une nouvelle évolution du langage est normalisée par l'ISO : C99 (ISO 9899). Parmi les ajouts, on notera des fonctionnalités déjà présentes dans certains compilateurs comme GCC, ainsi que des fonctionnalités (types complexes, mot-clef « restrict », directives agissant sur la simplification des instructions arithmétiques) souhaitables pour les calculs numériques intensifs, domaine habituel de FORTRAN.
Le langage C a été utilisé pour rendre le système d'exploitation UNIX plus portable. Il a conservé de cela une très grande efficacité pour tout ce qui concerne le développement système. Ainsi depuis la majorité des grands systèmes d'exploitation ont été développés en C.
De même, le langage ne propose pas en standard la gestion de la programmation orientée objet, ni de mécanisme d'exception, ou de traitement multitâche. Il existe des fonctions standards pour gérer les entrées-sorties et les chaînes de caractères, mais contrairement à d'autres langages, aucun opérateur spécifique pour améliorer l'ergonomie. Ceci rend aisé le remplacement des fonctions standards par des fonctions spécifiquement conçues pour un programme donné. En autorisant la surcharge des opérateurs, C++ permet de mélanger la souplesse de C à l'ergonomie des opérateurs spécifiques.
Ces caractéristiques en font néanmoins un langage à privilégier quand on cherche à maîtriser les ressources utilisées, le code assembleur généré par les compilateurs étant relativement prévisible et parfois même optimal sur les machines d'architecture RISC à grand nombre de registres.
Ce langage est donc extrêmement utilisé dans des domaines comme : la programmation embarquée sur microcontrôleurs, les calculs intensifs, l'écriture de systèmes d'exploitation et tous les modules où la rapidité de traitement est importante. Il est en effet une bonne alternative aux langages assembleurs dans ces domaines avec les avantages d'une syntaxe plus lisible et de la portabilité du code.
En contrepartie, la mise au point de programmes en C, surtout s'ils utilisent des structures de données 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 (libération de la mémoire, vérification de la validité des index sur les tableaux…) qui sont pris en charge automatiquement par les langages de haut niveau.
Le C étant un langage simple, son compilateur l'est également. Cela se ressent au niveau du temps de développement d'un compilateur C pour nouveau microprocesseur, qui selon Kernighan et Ritchie estiment qu'il peut être développé en deux mois. C'est pour cela qu'il est souvent choisi comme premier langage sur une nouvelle architecture. Le compilateur GNU GCC est d'ailleurs écrit en C : seule la partie de génération de code est à modifier quand on porte le compilateur sur une autre machine, par compilation croisée.
Beaucoup de limitations du langage C ont été levées dans le langage C++ qui est, à l'origine, un C avec la notion d'objet.
Beaucoup d'autres langages de programmation ont adopté une syntaxe (notation) ressemblant à celle du langage C, notamment C++, Java, JavaScript, PHP ou C#.
#include <stdio.h> inclut le fichier d'en-tête stdio.h, contenant les déclarations des fonctions d'entrée-sortie de la bibliothèque standard du C.
main est le nom de la fonction principale (la première appelée) du programme.
void entre les parenthèses signifie que la fonction main ne prend aucun paramètre. Cependant, il n'est pas obligatoire de le spécifier.
{ et } entourent les instructions constituant le corps de la fonction main.
printf est la fonction d'écriture formatée dans la sortie standard (la console par défaut).
" délimitent une chaîne de caractères. Dans ce cas, cela sera la chaîne à afficher.
\n désigne le caractère de nouvelle ligne.
; termine toute instruction.
return qui retournera la valeur 0 (ce qui par convention signifie « aucune erreur »).
Les étapes menant des sources au fichier exécutable sont au nombre de quatre :
Le préprocesseur effectue des remplacements de textes, des inclusions de fichiers (généralement les fichiers d'en-têtes contenant diverses déclarations) avec la possibilité d'effectuer certaines opérations uniquement si certaines conditions sont remplies. C'est également durant cette étape que les commentaires sont supprimés.
Cette étape est divisée en trois sous-étapes, qui sont :
Par abus de langage, on appele compilation toute la phase de génération d'un fichier exécutable à partir des fichiers sources. Mais c'est bien une des étapes menant à la création d'un exécutable.
#include,
#define,
#pragma (C89),
#if,
#ifdef,
#ifndef,
#elif (C89),
#else,
#endif,
#undef,
#line,
#error.
auto,
break,
case,
const (C89),
continue,
default,
do,
else,
enum (C89),
extern,
for,
goto,
if,
inline (C99),
register,
restrict (C99),
return,
sizeof,
static,
struct,
switch,
typedef,
union,
void (C89),
volatile (C89),
while,
signed (C89),
unsigned,
char,
short,
int,
long,
float,
double,
_Bool (C99),
_Complex (C99),
_Imaginary (C99)
char (identique à signed char), unsigned char
short (identique à unsigned short)
int, (identique à unsigned int)
long (identique à unsigned long)
long long (identique à unsigned long long)
float, double, long double (C89)
enum
struct, union
Lorsqu'une variable est signée, elle peut représenter une valeur négative. La plage des valeurs disponibles est alors divisée par deux par rapport à une non signée, avec le 0 (en base décimale) comme centre de cette plage.
Voici un exemple avec le type char :
La notion de variable signée n'a de sens que pour les types entiers. Les types flottants réservent tous un bit pour le signe. Le reste des bits est utilisé pour la partie entière et la mantisse.
Initialement, les commentaires devaient commencer par un slash et une étoile ("/*") et se terminer par une étoile et un slash. Tout ce qui est compris entre ces symbole est du commentaire, saut de ligne compris : /* Ceci est un commentaire sur deux lignes*/ La norme C99 a ajoutée la possibilité de faire des commentaires sur une seule ligne, de la même manière que le C++ : //Commentaire comme en C++, valable jusqu'au saut de ligne
La syntaxe des différentes structures de contrôles existantes en C est largement reprise dans plusieurs autres langages, comme le C++ bien sûr, mais également Java, C#, PHP ou encore JavaScript.
Les trois grands types de structures sont présentes :
if .. else if .. else
switch .. case .. default
while
for
do .. while
break
continue
return
goto
La bibliothèque standard est assez pauvre en comparaison de celle fournie par d'autres langages. Voici une liste de quelques fichiers contenant les déclarations des types et fonctions de la bibliothèque standard :
assert.h : pour un diagnostic de conception lors de l'exécution (assert)
ctype.h : tests et manipulation des caractères (isalnum, tolower)
errno.h : gestion minimales des erreurs (déclaration de la variable errno)
math.h : fonctions mathématiques de base (sqrt, cos)
signal.h : gestion des signaux (signal et raise)
stddef.h : définitions générales (déclaration de la constante NULL)
stdio.h : pour les entrées/sorties de base (printf, scanf)
stdlib.h : fonctions générales (malloc, rand)
string.h : manipulation des chaînes de caractères (strcmp, strlen)
time.h : manipulation du temps (time, ctime)
La bibliothèque standard n'offre aucun support du réseau, des entrées/sorties évoluées (port série ou parallèle) ou encore la gestions des erreurs (comme avec des exceptions).
Des essais de comparaison entre le C et l'assembleur effectués depuis 1990 sur des machines RISC montrent, de façon tout à fait contre-intuitive, un net avantage au C lorsque toutes les options d'optimisation du compilateur sont activées. Les optimiseurs construisent en effet un graphe chromatique qui leur permet d'allouer sans se tromper les usages de registres de façon quasi-optimale, là où un programmeur serait vite perdu. Ils regroupent de plus directement les instructions en réarrangeant les chargements et sauvegardes de registres pour bénéficier de l'effet pipeline. La même opération effectuée sur un programme source serait envisageable, mais le rendrait quasi impossible ensuite à maintenir.
En revanche, les optimiseurs ont moins de latitude concernant la réorganisation d'instructions CISC, plus complexes, et dans ce cas précis les résultats sont moins tranchés.
Voici quelques exemples présentant très succinctement quelques propriétés du C. Pour plus d'information, voir le WikiLivre Programmation C.
Voici une implémentation possible de la fonction strlen de la bibliothèque standard qui retourne la longueur d'une chaîne de caractères. Le principe est de parcourir les caractères jusqu'à ce qu'on tombe sur un caractère nul, marquant conventionnellement la fin d'une chaîne en C.
#include <stddef.h> /* Retourne : la longueur de la chaîne str. */ size_t strlen(char *str) { char *start = str; /* start = adresse du début de la chaîne */ while (*str != '\0') /* Tant qu'on n'est pas en fin de chaîne */ ++str; /* pointer le caractère suivant. */ return str - start; /* La longueur est la différence entre */ /* la fin et le début de la chaîne. */ }
La structure int_list représente un élément d'une liste chaînée, contenant des données de type int. Les deux fonctions qui suivent (insert_next et remove_next) servent à ajouter et supprimer un élément de la liste.
#include <stdlib.h> struct int_list { struct int_list *next; /* pointeur sur l'élément suivant */ int value; /* valeur de l'élément */ }; /* * Ajouter un élément à la suite d'un autre. * node : élément après lequel ajouter le nouveau * val : valeur de l'élément à ajouter * Retourne : adresse de l'élément ajouté, ou NULL en cas d'erreur. */ struct int_list *insert_next(struct int_list *node, int val) { struct int_list *const new_next = malloc(sizeof(struct int_list)); /* Allocation de la mémoire pour un nouvel élément. */ if (new_next) { /* Si l'allocation a réussi, alors */ new_next->next = node->next; /* insérer new_next entre node et node->next */ new_next->value = val; node->next = new_next; } return new_next; } /* * Supprimer l'élément suivant un autre. * node : élément dont le suivant est supprimé */ void remove_next(struct int_list *node) { struct int_list *node_next_next = node->next->next; /* node_next_next = adresse de l'élément suivant le suivant. */ free(node->next); /* Libération de la mémoire occupée par l'élément suivant node. */ node->next = node_next_next; /* Le suivant de node est l'ex-suivant du suivant. */ }
Dans cet exemple, les deux fonctions essentielles sont malloc et free. La première sert à allouer de la mémoire, le paramètre qu'elle reçoit est le nombre d'octets que l'on désire allouer et elle retourne l'adresse du premier octet qui a été alloué, sinon elle retourne NULL. free sert à libérer la mémoire qui a été allouée par malloc.
Langage de programmation | Langage impératif | Norme ISO
C (programmeertaal) | Lenguache de programazión C | سي | Llinguaxe de programación C | C | C (мова праграмавання) | C (език за програмиране) | C programski jezik | Llenguatge C | C (programovací jazyk) | C (programmeringssprog) | C (Programmiersprache) | C (γλώσσα προγραμματισμού) | C programming language | C (programlingvo) | Lenguaje de programación C | C (programmeerimiskeel) | C programazio lengoaia | C (ohjelmointikieli) | C (Teanga ríomhchlárúcháin) | Linguaxe de programación C | C (שפת תכנות) | C (programski jezik) | C programozási nyelv | C (linguage de programmation) | Bahasa pemrograman C | Forritunarmálið C | C (linguaggio) | C言語 | C 프로그래밍 언어 | C (zimanê bernamekirinê) | C (codex programmandi) | C (kalba) | C (programmēšanas valoda) | Bahasa pengaturcaraan C | C (programmeertaal) | Programmeringsspråket C | C (programmeringsspråk) | C (język programowania) | Linguagem de programação C | Limbajul C | Си (язык программирования) | C (jezik) | C programming language | C (programovací jazyk) | Programski jezik C | Gjuha programuese C | Програмски језик C | C (programspråk) | சி நிரலாக்கல் மொழி | ภาษาซี | C programlama dili | C (мова програмування) | C (ngôn ngữ lập trình) | C语言
This article is licensed under the GNU Free Documentation License.
It uses material from the
"C (langage)".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world