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

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.