Une courte introduction à C++ Karl Tombre École des Mines de Nancy Version 1.0

Une courte introduction à C++ Karl Tombre École des Mines de Nancy Version 1.0 Octobre 1999 1 Un peu d’histoire Le langage C++ a deux grands ancêtres : – Simula, dont la première version a été conçue en 1967. C’est le premier langage qui introduit les principaux concepts de la programmation objet. Probablement parce qu’il était en avance sur son temps, il n’a pas connu à l’époque le succès qu’il aurait mérité, mais il a eu cependant une influence considérable sur l’évolution de la programmation objet. Développé par une équipe de chercheurs norvégiens, Simula-67 est le successeur de Simula I, lui- même inspiré d’Algol 60. Conçu d’abord à des fins de modélisation de systèmes physiques, en re- cherche nucléaire notamment, Simula I est devenu un langage spécialisé pour traiter des problèmes de simulation. Ses concepteurs faisaient aussi partie du groupe de travail IFIP 1 qui poursuivait les tra- vaux ayant donné naissance à Algol 60. Simula-67 est avec Pascal et Algol 68 un des trois langages issus des différentes voies explorées au sein de ce groupe. Son nom fut changé en Simula en 1986. Comme son prédécesseur Simula I, Simula permet de traiter les problèmes de simulation. En par- ticulier, un objet est considéré comme un programme actif autonome, pouvant communiquer et se synchroniser avec d’autres objets. C’est aussi un langage de programmation général, reprenant les constructions de la programmation modulaire introduites par Algol 60. Il y ajoute les notions de classe, d’héritage et autorise le masquage des méthodes, ce qui en fait un véritable langage à objets. – Le langage C a été conçu en 1972 aux laboratoires Bell Labs. C’est un langage structuré et modulaire, dans la philosophie générale de la famille Algol. Mais c’est aussi un langage proche du système, qui a notamment permis l’écriture et le portage du système Unix. Par conséquent, la programmation orientée système s’effectue de manière particulièrement aisée en C, et on peut en particulier accéder directement aux fonctionnalités du noyau Unix. C possède un jeu très riche d’opérateurs, ce qui permet l’accès à la quasi-totalité des ressources de la machine. On peut par exemple faire de l’adressage indirect ou utiliser des opérateurs d’incrémentation ou de décalage. On peut aussi préciser qu’on souhaite implanter une variable dans un registre. En conséquence, on peut écrire des programmes presque aussi efficaces qu’en langage d’assemblage, tout en programmant de manière structurée. Le concepteur de C++, Bjarne Stroustrup, qui travaillait également aux Bell Labs, désirait ajouter au langage C les classes de Simula. Après plusieurs versions préliminaires, le langage a trouvé une première forme stable en 1983, et a très rapidement connu un vif succès dans le monde industriel. Mais ce n’est qu’assez récemment que le langage a trouvé sa forme définitive, confirmée par une norme. C++ peut être considéré comme un successeur de C. Tout en gardant les points forts de ce langage, il corrige certains points faibles et permet l’abstraction de données. De plus, il permet la programmation objet. D’autres langages, et en particulier Java, se sont fortement inspirés de la syntaxe de C++. Celle-ci est de ce fait devenue une référence. Nous supposons en particulier que les élèves qui ont déjà appris Java ne seront pas dépaysés par ce langage. Cependant, nous voulons mettre en garde contre plusieurs fausses ressemblances: si la syntaxe est la même ou très proche, plusieurs concepts sous-jacents sont différents. Nous nous efforcerons de signaler ces pièges potentiels. 2 Types de base et constantes En C++, les types de base sont : – bool : booléen 2, peut valoir true ou false, – char : caractère (en général 8 bits), qui peuvent aussi être déclarés explicitement signés (signed char) ou non signés (unsigned char), – int : entier (16 ou 32 bits, suivant les machines), qui possède les variantes short [int] et long [int], tous trois pouvant également être declarés non signés (unsigned), – float : réel (1 mot machine), 1. International Federation for Information Processing. 2. La présence d’un type booléen explicite est assez récente ; auparavant, les entiers étaient interprétés comme des booléens suivant leur valeur nulle ou non-nulle, et par compatibilité C++ continue à accepter des valeurs entières à la place de valeurs booléennes. 1 – double : réel en double précision (2 mots machines), et sa variante long double (3 ou 4 mots machine), – void qui spécifie un ensemble vide de valeurs. Les constantes caractères s’écrivent entre quotes simples : ’a’ ’G’ ’3’ ’*’ ’[’ Certains caractères de contrôle s’écrivent par des séquences prédéfinies ou par leur code octal ou hexadéci- mal, comme par exemple: \n \t \r \135 \’ \x0FF Les constantes entières peuvent s’écrire en notations décimale, hexadécimale (précédées de 0x 3) ou octale (précédées de 0 4). Pour forcer la constante à être de type entier long, il faut ajouter un L à la fin, de même le suffixe u indique une constante non signée : 12 -43 85 18642 54L 255u 38ul 0xabfb 0x25D3a 0x3a 0321 07215 01526 Les constantes réelles s’écrivent avec point décimal et éventuellement en notation exponentielle: 532.652 -286.34 12.73 52e+4 42.63E-12 -28.15e4 Les constantes de type chaînes de caractères (voir plus loin) s’écrivent entre double-quotes: "Home sweet home" "Français, je vous ai compris." 3 Opérateurs et expressions C++ offre un jeu très étendu d’opérateurs, ce qui permet l’écriture d’une grande variété d’expressions. Un principe général est que toute expression retourne une valeur. On peut donc utiliser le résultat de l’éva- luation d’une expression comme partie d’une autre expression. De plus, le parenthésage permet de forcer l’ordre d’évaluation. Les opérateurs disponibles sont les suivants : 3.1 Opérateurs arithmétiques + addition - soustraction * multiplication / division (entière ou réelle) % modulo (sur les entiers) 3.2 Opérateurs relationnels > >= <= < comparaisons == != égalité et inégalité ! négation (opérateur unaire) && ET relationnel || OU relationnel 3. zéro-X. 4. zéro. 2 3.3 L’affectation = affectation Il faut bien noter que le signe = est l’opérateur d’affectation, et non de comparaison; cela prête parfois à confusion, et entraîne des erreurs difficiles à discerner. À noter aussi que l’affectation est une expression comme une autre, c’est-à-dire qu’elle retourne une valeur. Il est donc possible d’écrire: a = b = c+2; ceci revenant à affecter à b le résultat de l’évaluation de c+2, puis à a le résultat de l’affectation b = c+2, c’est-à-dire la valeur qu’on a donnée à b. Remarquez l’ordre d’évaluation de la droite vers la gauche. 3.4 Opérateurs d’incrémentation et de décrémentation ++ incrémentation -- décrémentation Ces opérateurs, qui ne peuvent être appliqués que sur les types scalaires, peuvent s’employer de deux ma- nières : en principe, s’ils préfixent une variable, celle-ci sera incrémentée (ou décrémentée) avant utilisation dans le reste de l’expression; s’ils la postfixent, elle ne sera modifiée qu’après utilisation. Ainsi : a = 5; b = 6; c = ++a - b; donnera à c la valeur 0, alors que a = 5; b = 6; c = a++ - b; lui donnera la valeur -1. Faites cependant attention dans les expressions un peu complexes où on réutilise la même variable plusieurs fois : l’ordre d’évaluation n’est pas garanti, et l’expression peut donc avoir des résultats différents suivant la machine utilisée. Par exemple, le résultat de l’expression suivante est indéfini: t[++a] = a; 3.5 Opérateurs logiques Ce sont les opérateurs permettant d’effectuer des opérations au niveau des bits (masquages). & AND. Exemple: a & 0x000F extrait les 4 bits de poids faible de a. | OR. Ainsi, b = b | 0x100 met à 1 le 9ème bit de b. ^ XOR. << SHIFT à gauche. a = b << 2 met dans a la valeur de b où tous les bits ont été décalés de 2 positions vers la gauche. >> SHIFT à droite. ~ complément à 1 (opérateur unaire). 3.6 Modifier la valeur d’une variable Nous avons déjà vu l’affectation, l’incrémentation et la décrémentation. Il arrive très souvent qu’on cal- cule la nouvelle valeur d’une variable en fonction de son ancienne valeur. C++ fournit pour cela un jeu d’opérateurs combinés, de la forme <variable> <op>= <expr> où <op> est un opérateur. Une telle expression est équivalente à l’expression: <variable> = <variable> <op> <expr> += a += b équivaut à a = a + b; — À noter : a++ ⇐ ⇒a += 1 ⇐ ⇒a = a + 1 -= idem, de même que *=, /=, %=, «=, »=, &=, |= et^=. 3 3.7 Expressions conditionnelles expr1? expr2 : expr3 est évaluée de la manière suivante: si expr1 alors expr2 sinon expr3 fsi Cela est pratique par exemple pour calculer le maximum de 2 nombres sans passer par une fonction: z = (a > b) ? a : b; Cette construction pourrait bien sûr s’exprimer avec une structure conditionnelle de la forme si–alors–sinon, mais l’écriture sous forme d’expression conditionnelle est plus compacte. 3.8 Conversions de types On désire souvent changer le type du résultat retourné par une expression. Pour cela existe le mécanisme de cast 5 : (<nom de type>) expression uploads/s3/ introduction-a-c.pdf

  • 43
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager