Côté langages
37
En C et C++, le comportement en cas de division par zéro, en entier, n’est pas spécifié par la norme (en
général, il conduit à un arrêt du programme). En Java ou C#, en revanche, on obtient une « exception »
que l’on peut gérer par programme (par défaut, il y a arrêt du programme).
Le comportement de C ou C++ en cas de dépassements ou sous-dépassements de capacité en réel
n’est pas défini par la norme. En revanche, Java et C# utilisent un codage parfaitement défini (IEEE) pour
les réels, dans lequel existent des notations spéciales telles que NaN (Not A Number), Infinity (infini).
Par exemple la division de 5.3 par zéro fournit Infinity et la division de Infinity par Infinity
fourni NaN. Ces différentes valeurs peuvent être testées dans le programme.
Expresssions mixtes
Nous n’avions considéré que des expressions mixtes très simples, puisque ne pouvant contenir que deux
types différents (entier et réel). Dans la plupart des langages, on dispose de beaucoup plus de types
numériques, de sorte que les conversions possibles sont plus nombreuses. Qui plus est, certains langages
comme C, C++, Java ou C# autorisent des conversions d’un type caractère vers un des types entier.
Expressions non définies
C, C++ et C# initialisent les variables à zéro, avant leur utilisation. Java détecte dès la compilation les situations de variables non définies.
En PHP, les emplacements des variables sont définis au fur et à mesure des besoins (ne pas oublier
qu’une variable peut changer de type, donc de taille, au fil de l’exécution du programme). Il existe un
moyen de savoir si une variable a déjà reçu une valeur ou non (et, même de connaître son type) a .
Constantes symboliques et expressions constantes
En C, on peut déclarer :
const int n = 10 ;
Cette instruction demande au compilateur de s’assurer qu’aucune instruction ne cherche à modifier la
valeur de n. Mais, malgré les apparences, n n’est pas une constante symbolique, c’est-à-dire que sa valeur
effective n’est pas connue du compilateur. En particulier, nous verrons qu’elle ne pourra pas servir à fixer la
dimension d’un tableau. On pourra utiliser des « définitions de symboles » de la forme :
#define N 10
Celles-ci seront interprétées par un « préprocesseur », à la manière d’un traitement de texte élaboré qui,
ici, remplacera toute occurrence de N par 10, avant compilation.
a.Signalons que cela n’est possible que parce que, contrairement à la plupart des autres langages, une variable ne
contient pas directement une valeur, mais une « référence » (adresse) à une valeur ; dans le cas d’une variable non
initialisée, elle comporte une référence « nulle » qui a été ainsi créée lorsque l’on a rencontré le symbole
correspondant pour la première fois dans le programme. Notez que ce mode de gestion par référence sera étudié en
détail dans le cas des objets.
37
En C et C++, le comportement en cas de division par zéro, en entier, n’est pas spécifié par la norme (en
général, il conduit à un arrêt du programme). En Java ou C#, en revanche, on obtient une « exception »
que l’on peut gérer par programme (par défaut, il y a arrêt du programme).
Le comportement de C ou C++ en cas de dépassements ou sous-dépassements de capacité en réel
n’est pas défini par la norme. En revanche, Java et C# utilisent un codage parfaitement défini (IEEE) pour
les réels, dans lequel existent des notations spéciales telles que NaN (Not A Number), Infinity (infini).
Par exemple la division de 5.3 par zéro fournit Infinity et la division de Infinity par Infinity
fourni NaN. Ces différentes valeurs peuvent être testées dans le programme.
Expresssions mixtes
Nous n’avions considéré que des expressions mixtes très simples, puisque ne pouvant contenir que deux
types différents (entier et réel). Dans la plupart des langages, on dispose de beaucoup plus de types
numériques, de sorte que les conversions possibles sont plus nombreuses. Qui plus est, certains langages
comme C, C++, Java ou C# autorisent des conversions d’un type caractère vers un des types entier.
Expressions non définies
C, C++ et C# initialisent les variables à zéro, avant leur utilisation. Java détecte dès la compilation les situations de variables non définies.
En PHP, les emplacements des variables sont définis au fur et à mesure des besoins (ne pas oublier
qu’une variable peut changer de type, donc de taille, au fil de l’exécution du programme). Il existe un
moyen de savoir si une variable a déjà reçu une valeur ou non (et, même de connaître son type) a .
Constantes symboliques et expressions constantes
En C, on peut déclarer :
const int n = 10 ;
Cette instruction demande au compilateur de s’assurer qu’aucune instruction ne cherche à modifier la
valeur de n. Mais, malgré les apparences, n n’est pas une constante symbolique, c’est-à-dire que sa valeur
effective n’est pas connue du compilateur. En particulier, nous verrons qu’elle ne pourra pas servir à fixer la
dimension d’un tableau. On pourra utiliser des « définitions de symboles » de la forme :
#define N 10
Celles-ci seront interprétées par un « préprocesseur », à la manière d’un traitement de texte élaboré qui,
ici, remplacera toute occurrence de N par 10, avant compilation.
a.Signalons que cela n’est possible que parce que, contrairement à la plupart des autres langages, une variable ne
contient pas directement une valeur, mais une « référence » (adresse) à une valeur ; dans le cas d’une variable non
initialisée, elle comporte une référence « nulle » qui a été ainsi créée lorsque l’on a rencontré le symbole
correspondant pour la première fois dans le programme. Notez que ce mode de gestion par référence sera étudié en
détail dans le cas des objets.
