Les variables
Introduction et commentaires
Dans cette série d'articles nous allons voir des bases de programmation. Il est recommandé d'avoir consulté au préalable l'article traitant des données numériques. Les sujets traités seront les variables (types, constantes, tableaux, les pointeurs ou références), les structures de contrôle (boucle, switch, conditions) et les fonctions (déclaration, utilisation). Au delà, les détails propres à chaque langages seront traités dans des articles dédiés à chacun d'entre eux.
Les différents langages traités ici, ne pas du même niveau. En effet, le langage C est un langage bas niveau qui doit être compilé (comprendre transformé) en instruction machine lui donnant ainsi une rapidité d’exécution sans pareil. Les autres langages (Perl, PHP et Javascript) sont pour leur part des langages dits de haut niveau. Chacune de leur instruction est interprété par un programme appelé interpréteur qui peut être au choix, votre navigateur web pour javascript, ou un programme spécifique au langage dans les cas du Perl et de PHP.
Pour information dans les parties code définies comme ci-dessous, vous trouverez des commentaires aidant à la bonne compréhension des codes. Il seront représentés comme suit:
// Ceci est un commentaire (Javascript, PHP, C) /* Il s'agit également d'un commentaire * Pouvant être rédigé * Sur plusieurs lignes (Javascript, PHP, C) */ # C'est un commentaire aussi (Perl, Shell)
Les commentaires sont des chaînes de caractères (mots, phrases) insérés dans du code de manière à ne pas être interprété. Ils n'ont de valeur que pour les programmeurs, lecteurs du code. Un commentaire n'influencera pas le déroulement d'un programme. Il pourra par contre aider un programmeur reprenant le code d'un autre.
Présentation des variables
En programmation, on appelle variable l'association entre un mot clé (nom de variable) et une (ou plusieurs) valeur pouvant être modifiée au fur et à mesure du déroulement du programme.
Pour ceux qui se sentent déjà perdus, voici un exemple simple en PHP.
<?php // En PHP les noms variables doivent être précédés du symbole $ // Je renseigne ici ma variable $nomprenom avec un nouveau contenu $nomprenom='Henry Dupont'; // J'utilise ici le contenu de cette variable // La fonction echo permet d'afficher du texte et le contenu (ASCII, affichable) de certaines variables simples echo "Salutations $nomprenom"; ?>
Le code ci-dessus affichera: Salutations Henry Dupont
Si la valeur de la variable $nomprenom venait à être modifié, le même morceau de code affichera le nouveau contenu de $nomprenom.
Cela pourrait permettre par exemple de créer des salutations pour une liste de prénom-nom sans avoir à réécrire le code pour chaque cas de figure.
Une variable peut avoir un contenu bien plus complexe qu'un simple texte et c'est ce que nous allons voir ci-dessous.
Les constantes
En opposition avec les variables, on trouve les constantes qui, comme leur nom l'indique ont un contenu qui ne change pas.
Par exemple, PI est une constante, sa valeur ne changera pas au cours de l’exécution d'un programme. (en tout cas pas sans remettre en cause un certain nombre de choses)
Exemple en Javascript
// Définition de la constante PI const PI=3.14159265359; // Définition de la variable r (pour rayon) r=12; // Utilisation de la constante PI avec la variable r console.log('Circonférence d’un cercle de rayon r: ' + r + '=' + (2*PI*r);
L'exemple ci-dessus affichera: Circonférence d’un cercle de rayon r: 12 = 75.39822368616001
Exemple en PHP
<?php // Définition de la constante PI define("PI", 3.14159265359); // Définition de la variable r (pour rayon) $r=12; // Utilisation de la constante PI avec la variable r echo "Circonférence d’un cercle de rayon r: $r = ".(2*PI*$r); ?>
L'exemple ci-dessus affichera: Circonférence d’un cercle de rayon r: 12 = 75,39822368616
Exemple en C
#include <stdio.h> #include <stdlib.h> /* Pour compiler ce code source: * gcc constante.c -o constante.exe * Pour éxécuter ce programme une fois compilé ./constante.exe (sous UNIX/Linux) ou constante.exe (sous Windows) */ /* Définition de la constante PI */ #define PI 3.14159265359 int main(void) { /* Définition de la variable r (pour rayon) short int r=12; /* Utilisation de la constante PI */ printf("Circonférence d’un cercle de rayon r: %d = %f\n", r, (float) (2*PI*r)); return EXIT_SUCCESS; }
L'exemple ci-dessus affichera une fois compilé et éxécuté: Circonférence d’un cercle de rayon r: 12 = 75.398224
Exemple en Perl
#!/usr/bin/perl use strict; use warnings; # Définition de la constante PI use constant PI => 3.14159265359; # En Perl, comme en PHP les noms de variable doivent être précédés du symbole $ # Définition de la variable r (pour rayon) my $r=12; # Utilisation de la constante PI avec la variable r print "Circonférence d'un cercle de rayon r: $r = ".(2*PI*$r)."\n";
L'exemple ci-dessus affichera une fois exécuté: Circonférence d'un cercle de rayon r: 12 = 75.39822368616
Pour une constante il est important que quelqu'un ne puisse pas faire quelque chose comme ça: PI=8.53!!! C'est pour cela que les constantes sont en général définies d'une manière différente des variables.
Typage
Le typage correspond à la définition du type des données à stocker. Il existe différents niveaux de typage dépendants du langage utilisé.
Par exemple on parlera de typage statique un langage bas niveau comme C où le programmeur doit définir à l'avance (début de fonction ou de programme) le type de données qui sera stocké dans la variable (char, int, cf: Article sur les données numériques). Au contraire on parlera plutôt de typage dynamique pour des langages de plus haut niveau (PHP par exemple) qui ne demanderont pas au programmeur de définir à l'avance ses variables ni de spécifier le type des données qui seront stockées.
3 est un nombre. Nombre est un type.
3.1415 est un nombre à virgule. Nombre à virgule est un type.
C est une lettre. Lettre est également un type.
Bonjour est un mot. Mot est aussi un type (en fonction des langages).
-8 est un nombre négatif. Nombre négatif a lui aussi un type pour le représenter.
Déclarez vos variables
Dans l'oeuvre de Douglas Adams Le guide du voyageur intergalactique il est dit que la réponse à la Grande Question sur la Vie, l'Univers et le Reste est 42. Essayons de rentrer le nombre 42 dans une variable et ceci dans différents langages.
En C (typage statique)
/* On précise un type numérique adapté */ short int reponse=42; /* On pourrait également utiliser un type plus large */ int reponse=42; /* Ou encore plus petit car le nombre est inférieur à 127 */ /* Attention! Dans ce cas de figure le nombre n'est pas stocké sous forme de caractère mais bien sous sa forme numérique */ /* Ce qui donne en hexadécimal: 2A */ /* Le caractère ASCII associé à 2A est * ce qui vous vous en doutez n'a rien à voir avec le contenu que nous venons d'entrer dans cette variable */ char reponse=42; /* Ici il sera stocké sous forme d'une chaîne de caractère ASCII soit 2 caractères de 8 bits chacun */ /* Soit en hexadécimal: 34 32 */ /* N'étant pas de type numérique, il sera alors impossible de l'utiliser dans des calculs en l'état. */ char reponse[]="42"; /* B est un caractère donc de type char et sera stocké avec son code ASCII : 42 */ char lettre='B'; /* Bonjour est un mot, en C un mot est un tableau de caractères (appelé aussi string) * Ce tableau (que nous verrons plus en détails dans un autre article) contiendra respectivement les codes ASCII des lettres * B o n j o u r soit 42 6F 6E 6A 6F 75 72 */ char mot[]="Bonjour";
Le langage C est très précis et propose de nombreux types de données pour définir les variables.
En PHP (typage dynamique)
<?php /* PHP déterminera qu'il s'agit d'un numérique et adaptera le type de la variable en conséquence */ $reponse=42; // Affiche integer ce qui correspond à un entier echo gettype($reponse) /* Si 42 est entouré de double quotes, PHP l’interprétera alors comme une chaîne de caractères, c'est une forme de typage en PHP */ $reponse="42"; // Affiche string ce qui correspond à une chaîne de caractères echo gettype($reponse) // Toutefois, si on utilise $reponse défini avec les doubles quotes dans un calcul, celui-ci sera alors interprété comme un nombre */ echo ($reponse + $reponse); // Affichera 84 ?>
En Perl (typage dynamique)
/* Perl détermine qu'il s'agit d'une valeur numérique */ my $reponse=42; /* Perl détermine qu'il s'agit d'une chaîne de caractères */ my $reponse="42"; // Comme en PHP, utiliser $reponse défini comme une chaîne de caractère dans un calcul interprétera ce dernier comme un nombre. print ($reponse + $reponse); # Affichera 84
Enfin le cas particulier du Javascript
/* Javascript détermine qu'il s'agit d'une valeur numérique */ var reponse=42; console.log(typeof(reponse)); // Affichera number /* Javascript détermine qu'il s'agit d'une chaîne de caractères */ my $reponse="42"; console.log(typeof(reponse)); // Affichera string // A la différence de Perl de PHP, Javascript traitera un string en tant que tel, même dans un calcul console.log((reponse + reponse)); // Affichera 4242, on parle alors de concaténation (à suivre dans un autre article)
Exemple
Voici un petit script permettant de coder des valeurs numériques entières sur des type de 8 à 32 bits ne tenant pas compte de l'architecture (endianness)
Les signes
Le mot clé unsigned permet de préciser que le type n'est pas signé et ne pourra contenir par conséquent que des valeurs positives allant de 0 à 2x (où x vaut le nombre de bits du type). Un type signé permet lui de contenir des valeurs négatives comme positives allant de -2(x-1) à 2(x-1)-1. Pourquoi la valeur positive est diminuée de 1? C'est simple, la valeur 0 est une valeur qu'il faut prendre en compte dans nos calculs car elle existe bien.
Par exemple, un type unsigned char permet de coder des valeurs allant de 0 à 255 soit 256 valeurs. Dans le cas d'un char signé, on ne peut coder que de 256 valeurs également allant de -128 à 127 ce qui nous fait bien 256 valeurs en comptabilisant le 0. Le signe du nombre contenu utilise 1 bit dont la valeur est soit à 0 indiquant que le nombre est positif, soit à 1 indiquant que le nombre est négatif. Pour mieux comprendre, voici un petit exemple utilisant deux signed char de même valeur avec avec un signe différent. Attention! Cet exemple ne tient pas compte de l'architecture endianness un PC ne codera pas la valeur comme dans l'exemple ci-dessous, mais plutôt 111010012 soit e916 (l'ordre des bits est inversé).
Positions des bits | SIGNE | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|---|
Valeur binaire de 23 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
Valeur hexa de 23 | 1 | 7 |
Positions des bits | SIGNE | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|---|
Valeur binaire de -23 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
Valeur hexa de -23 | 9 | 7 |
Les flottants
Voici un type dédié au stockage des nombre décimaux.
En C il existe plusieurs types de flottant
/* Le flottant à précision simple */ float valeur=12.75; /* Le flottant à précision double */ double valeur=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899;
Voici comment les données sont rangées en fonction du type. Une fois encore, ce schéma ne tient pas compte de l'architecture. Garder une lecture de gauche à droite permet de simplifier la présentation de ces types plus complexes..
Le type float
Positions des bits | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Répartition des valeurs | Signe + ou - |
Exposant ×10puissance y |
Fraction 314159265358979323846264338327950288419716939937510582097494459230781640628620899 |
Le type double
Positions des bits | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ... | 60 | 61 | 62 | 63 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Répartition des valeurs | Signe + ou - |
Exposant ×10puissance y |
Fraction 314159265358979323846264338327950288419716939937510582097494459230781640628620899 |
Les autres langages traités ici (Perl, Javascript et PHP) ne feront pas de différence. Javascript nous répondra number quoi qu'il arrive, PHP stockera décrétera qu'il s'agit d'un double que nous souhaitions stocker 2.75 ou un nombre avec 50 décimales.
Nous venons de balayer dans cet article les variables simples avec la plupart des types de base utilisés en programmation. Il en existe d'autres plus complexes et plus spécifique dont nous étudierons (pour certain) les détails dans d'autres articles à venir.
Liens et références
En attendant le prochain article, si vous souhaitez vous documenter un peu sur le sujet, voici quelques liens intéressants:
- Article Wikipedia sur le C
- Article Wikipedia sur les types de données du C (en anglais)
- Manuel de programmation en C (en anglais)
- Article Wikipedia sur le Javascript
- Manuel de programmation en Javascript
- Article Wikipedia sur le Perl
- Manuel de programmation en Perl (en anglais)
- Article Wikipedia sur le PHP
- Le manuel de programmation en PHP
Ma documentation préférée reste celle du PHP que je trouve particulièrement bien présentée et facile à comprendre. Pour le reste, je vous souhaite une bonne lecture.