Programmation séquentielle en C, 2020-2021
Orestis Malaspinas (A401), ISC, HEPIA
2020-09-16
while
, for
, etc).#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Enter n: "); // affichage
int n = 0; // déclaration et initialisation de n
scanf("%d", &n); // entrée au clavier
int sum = 0; // déclaration et initialisation de sum
for (int i = 0; i <= n; ++i) { // boucle
sum += i;
}
printf("Sum of the %d first integers: %d\n", n, sum);
if (sum != n * (n+1) / 2) { // branchement cond.
printf("Error: the answer is wrong.\n");
return EXIT_FAILURE; // code d'erreur
}
return EXIT_SUCCESS; // code de réussite
}
Pour pouvoir être exécuté un code C doit être d’abord compilé (avec gcc
ou clang
).
Pour un code prog.c
la compilation “minimale” est
Il existe une multitude d’options de compilation:
$ clang -O1 -std=c11 -Wall -Wextra -g porg.c -o prog
-fsanitize=address -fsanitize=leak -fsanitize=undefined
-std=c11
utilisation de C11.-Wall et -Wextra
activation des warnings.-fsanitize=…
contrôles d’erreurs à l’exécution (coût en performance).-g
symboles de débogages sont gardés.-o
défini le fichier exécutable à produire en sortie.-O1
, -O2
, -O3
: activation de divers degrés d’optimisationauto |
double |
int |
struct |
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sizeof |
volatile |
do |
if |
static |
while |
En C lorsqu’on veut utiliser une variable (ou une constante), on doit déclarer son type
const double two = 2.0; // déclaration et init.
int x; // déclaration (instruction)
char c; // déclaration (instruction)
x = 1; // affectation (expression)
c = 'a'; // affectation (expression)
int y = x; // déclaration et initialisation en même temps
int a, b, c; // déclarations multiples
a = b = c = 1; // init. multiples
Type | Signification (gcc pour x86-64) |
---|---|
char , unsigned char |
Entier signé/non-signé 8-bit |
short , unsigned short |
Entier signé/non-signé 16-bit |
int , unsigned int |
Entier signé/non-signé 32-bit |
long , unsigned long |
Entier signé/non-signé 64-bit |
float |
Nombre à virgule flottante, simple précision |
double |
Nombre à virgule flottante, double précision |
La signification de short
, int
, … dépend du compilateur et de l’architecture.
Voir <stdint.h>
pour des représentations portables
Type | Signification |
---|---|
int8_t , uint8_t |
Entier signé/non-signé 8-bit |
int16_t , uint16_t |
Entier signé/non-signé 16-bit |
int32_t , uint32_t |
Entier signé/non-signé 32-bit |
int64_t , uint64_t |
Entier signé/non-signé 64-bit |
0
signifie faux, tout le reste vrai.stdbool
met à disposition un type bool
.true
false
Explicite:
Implicite:
Une expression est tout bout de code qui est évalué.
const int L = -1; // 'L' est une constante, -1 un littéral
int x = 0; // '0' est un litéral
int y = x; // 'x' est une variable
int z = L; // 'L' est une constante
Opérateurs testant la relation entre deux expressions:
(a opérateur b)
retourne 1
si l’expression s’évalue à true
, 0
si l’expression s’évalue à false
.Opérateur | Syntaxe | Résultat |
---|---|---|
< |
a < b |
1 si a < b; 0 sinon |
> |
a > b |
1 si a > b; 0 sinon |
<= |
a <= b |
1 si a <= b; 0 sinon |
>= |
a >= b |
1 si a >= b; 0 sinon |
== |
a == b |
1 si a == b; 0 sinon |
!= |
a != b |
1 si a != b; 0 sinon |
Opérateur | Syntaxe | Signification |
---|---|---|
&& |
a && b |
ET logique |
|| |
a || b |
OU logique |
! |
!a |
NON logique |
Opérateur | Syntaxe | Signification |
---|---|---|
+ |
a + b |
Addition |
- |
a - b |
Soustraction |
* |
a * b |
Multiplication |
/ |
a / b |
Division |
% |
a % b |
Modulo |
Opérateur | Syntaxe | Signification |
---|---|---|
= |
a = b |
Affecte la valeur b à la variable a |
et retourne la valeur de b |
||
+= |
a += b |
Additionne la valeur de b à a et |
assigne le résultat à a . |
||
-= |
a -= b |
Soustrait la valeur de b à a et |
assigne le résultat à a . |
||
*= |
a *= b |
Multiplie la valeur de b à a et |
assigne le résultat à a . |
||
/= |
a /= b |
Divise la valeur de b à a et |
assigne le résultat à a . |
||
%= |
a %= b |
Calcule le modulo la valeur de b à a et |
assigne le résultat à a . |
Opérateur | Syntaxe | Signification |
---|---|---|
++ |
++a |
Incrémente la valeur de a de 1 et |
retourne le résultat (a += 1 ). |
||
-- |
--a |
Décrémente la valeur de a de 1 et |
retourne le résultat (a -= 1 ). |
||
++ |
a++ |
Retourne a et incrémente a de 1. |
-- |
a-- |
Retourne a et décrémente a de 1. |
if
.. else if
.. else
(1/2)if
.. else if
.. else
(2/2)if ... else
if ... else
{...}
.int bar() { // x, y pas visibles ici, max oui }
int foo() {
int x = 1; // x est locale à foo
{
// x est visible ici, y pas encore
int y = 2;
bar(); // ni x ni y sont visible dans bar()
} // y est détruite à la sortie du bloc
} // x est à la sortie de foo
float max; // variable globale accessible partout
int main() {
int z; // locale, à main
} // z est détruite ici, max aussi
printf()
(1/2)La fonction printf()
permet d’afficher du texte sur le terminal:
Nombre d’arguments variables.
format
est le texte, ainsi que le format (type) des variables à afficher.
Les arguments suivants sont les expressions à afficher.
printf()
(2/2)scanf()
(1/2)La fonction scanf()
permet de lire du texte formaté entré au clavier:
format
est le format des variables à lire (comme printf()
).
Les arguments suivants sont les variables où sont stockées les valeurs lues.
scanf()
(2/2)