Premier Programme
Le premier programme que nous allons écrire affichera
un simple texte à l’écran : "Bonjour à tous !"
. Cela suppose
que vous ayez un éditeur de texte installé. Sur windows notepad
peut suffir, sur UNIX et MacOs vous pouvez utiliser nano
depuis l’invite de commandes
Créez un fichier avec une extension en .c
,
par exemple bonjour.c
et
avec un éditeur de texte écrivez y ceci
#include <stdio.h>
int main()
{
printf("Bonjour a tous !\n");
return 0;
}
Depuis une invite de commandes,
entrez la commande suivante cc -ansi bonjour.c
.
Le programme cc
(C compiler) transforme un fichier
code source écrit en C en programme exécutable.
Cela devrait produire un fichier
a.out .
Sur Windows, si vous n’utilisez pas WSL,
le programme peut s’apeller a.exe
.
Pour l’exécuter tapez ./a.out
dans la console :
Bonjour à tous !
devrait s’afficher à l’écran.
Tout programme C est constitué de fonctions et de variables
globales. Un programme C doit obligatoirement avoir une fonction
appellée “main
”, qui est appellée automatiquement au lancement
du programme.
Notre fonction main
contient un appel à une fonction
d’affichage de texte printf
qui prend en paramètre
une chaine de caractères. Les détails de la fonction
printf
sont contenus dans un fichier nommé stdio.h
que nous incluons en tête du programme.
On déclare également que notre fonction main
retourne
au système d’exploitation une valeur de type int
, c’est
à dire une valeur entière, ce que nous faisons avec
l’instruction return 0
.
La succession de caractères “\n
” correspond à un saut
de ligne. Una barre anti-oblique introduit un caractère
d’échappement qui permet d’afficher des caractères
difficiles à voir ou a représenter autrement.
On ne peut pas avoir de sauts de ligne en dur dans une
chaine de caractères sans erreur de compilation.
D’autres séquences d’échappement existents, par exemple
\t
affiche une tabulation, et \\
affiche une barre
anti-oblique. Par défaut printf
n’ajoute pas de
saut de ligne à la fin du texte qu’il affiche, si bien
qu’on peut construire une ligne avec plusieurs appels
successifs à printf
, par exemple
printf("Bonjour");
printf(" a ");
printf("tous !\n");
est équivalent au premier programme.
On remarque que chaque instruction se termine pas un
délimiteur point-virgule : ;
— qui est nécessaire en C.
Exercices
- Essayez de ne pas mettre de saut de ligne à la fin du programme, que se passe-il ?
- Essayez divers caractères d’échappement, que se passe-il ?
- Lisez rapidement la documentation de la commande
cc
(man cc
) pour comprendre à quel cas d’usage notre ligne de commande correspond. - Essayez de faire en sorte que l’executable final ait un
nom different de
a.out
, par exemplebonjour.out
.
Version ancienne
A noter qu’avant le C 99 ce programme pouvait être écrit ainsi
main()
{
printf("Bonjour a tous !\n");
}
Car lors de la genération de l’exécutable, la librairie
statique stdc
qui contient la définition de la fonction
printf
est incluse automatiquement à l’exécutable
et l’éditeur de liens est capable de la trouver
même si elle n’est pas déclarée au préalable. Depuis le
c99, il faut déclarer la fonction printf avant
de l’employer : extern int printf();
, ce qui est hors de
notre propos pour l’instant. GCC choisit d’ignorer la règle
du C99 et le tolère mais pas Clang ni MSVC. Voir
https://stackoverflow.com/a/437763
🌍⤴
Voir aussi la justification de ce changement dans le langage C99
https://open-std.org/JTC1/SC22/WG14/www/C99RationaleV5.10.pdf
🌍⤴
section 6.7.2 —
où on voit notamment qu’un compilateur n’est pas obligé d’interrompre
la compilation en cas de int
implicite, ce que fait GCC, mais pas les autres.
Omettre le type de retour d’une fonction est possible jusqu’au
C23 : dans ce cas la fonction est considérée comme retournant
int
par défaut. La fonction main
a également
la particularité de retourner automatiquement la valeur 0
si elle se termine sans encombre, donc de ne pas nécessiter
d’instruction return
, ce qui est toujours le cas aujourd’hui.
On voit donc que la version moderne du programme C le plus simple est aujourd’hui plus verbeuse qu’auparavent.