Le langage C Les bases Jean-Pierre Fournier, http://www.iut-orsay.fr/~fournier jpf@fiifo.u-psud.fr
Un peu d histoire B (Bell labs) (1970) [Ken Thompson] NB (new B) (B + types) (1971) [Dennis Ritchie] C (1972) C++ (1983-1985)[Bjarne Stroustrup] Java The green team (1991) 13 personnes sont chargées par Sun d anticiper la prochaine évolution de la programmation WebRunner (le navigateur HotJava), un clone de Mosaic basé sur Java version 1.0a2 (march 1995) => version 1.5 Le langage C 2
Dans un programme C, on trouve : Des déclarations Pour réserver des zones en mémoire et leur attribuer un nom int x, y; réserve deux emplacements nommés x et y pour accueillir des données numériques entières. float a, b, c; réserve trois emplacements a, b et c pour des données numériques réelles. Le langage C 3
Unités de mesure et déclarations 0 ou 1 : le bit (binary unit) 8 bits = 1 octet (byte) 1024 octets = 1kiloOctet (kb) ensuite Méga, Giga, Téra, Exa short => nombre entier sur 2 octets long => nombre entier sur 4 octets float => nombre réel sur 4 octets double => nombre réel sur 8 octets Le langage C 4
Déclarations (suite) un type particulier : char pour déclarer une zone numérique de 1 octet destinée à recevoir un petit nombre ou un code de caractère 8 bits codages de 0000 0000 à 1111 1111 le bit de gauche est le bit de signe (0 pour les nombres positifs, 1 pour les négatifs) 0000 0000 à 0111 1111 (0 à 127) 1000 0000 à 1111 1111 (-128 à -1) Le langage C 5
Les codages de caractères sur 1 octet ebcdic, ascii, ascii à bit de parité sur 2 octets unicode (alphabets internationaux, normes ISO ) en C : a renvoie le code de la lettre a, Z renvoie le code de la lettre Z majuscule char lettre = b ; pour réserver une zone mémoire de 1 octet initialisée avec le code de la lettre b. abcdef pour réserver une zone mémoire de 7 octets contenant les codes des lettres et un zéro. a b c d e f 0 Le langage C 6
Avec ou sans signe? unsigned char les 256 valeurs possibles sont considérées de 0 à 255, pas de -128 à 127 0000 0000 => 0 1111 1111 => +255 unsigned short, unsigned long, unsigned int Le langage C 7
Un premier programme void main(){ int x, y; char lettre; float a, b; ne renvoie aucun résultat dans le fichier exemple1.c compilé et lié par : gcc exemple1.c o ex1.exe message d avertissement : exemple1.c: In function `main': exemple1.c:1: warning: return type of `main' is not `int' essayé par ex1 résultat : Le langage C 8
Affectation et calculs int main(){ int x, y; char lettre; float a, b; Compilation : Aucun message! x = y = 4; lettre = 'p'; a = 5.6; b = a*2; x = y+6; b = x; b = (float) x; lettre = lettre * 2; l affectation inscrit la valeur de droite dans l objet de gauche. Le langage C 9
Présenter des résultats pour afficher, 3 outils (C++) cout, cerr les flots de sortie << l opérateur qui envoie vers le flot endl pour la fin de ligne cout << x << endl; affiche la valeur de x et passe à la ligne Le langage C 10
Exemple avec résultats #include <iostream> using namespace std; Pour avoir le droit d employer cout, << et endl int main(){ int x, y; char lettre; float a, b; x = y = 4; lettre = 'p'; a = 5.6; b = a*2; x = y+6; b = x; b = (float) x; Résultats affichés : x = 10 y = 4, lettre = Ó b = 10 lettre = lettre * 2; cout << "x = " << x << endl; cout << "y = " << y << ", lettre = " << lettre << endl << "b = " << b << endl; Le langage C 11
Fournir des données avec les outils de C++ => nom de fichier.c => compilation avec gpp deux éléments pour les données le flot cin, l opérateur >> cin >> x; pour placer la valeur qui vient du flot d entrée dans la variable x problème : risque d incohérence des données Le langage C 12
Exemple #include <iostream> using namespace std; int main(){ int x, y; cin >> x >> y; cout << "x = " << x << endl << "y = " << y << endl; Essai 1 : 12 56.4 x = 12 y = 56 Essai 2 : 4.5 6.42 x = 4 y = 0 Essai 3 : 4 z x = 4 y = 0 Le langage C 13
Les opérations élémentaires et combinées + - * / % : modulo 26 % 5 => 1 &! ^ (opérateurs binaires) et, ou, non, ou exclusif && (opérateurs logiques) et, ou <<, >> décalage binaire +=, -=, *=, /=, &=, =,!=, ^=, <<=, >>= x += 3 «ajouter 3 à x» au lieu de x = x+3 ++, -- x++ «ajouter 1 à x» au lieu de x = x + 1 les comparaisons : <, <=, >, >=, ==,!= attention : ne pas confondre == (compare) et = (affecte) Le langage C 14
Les tests if () et (()?:) #include <iostream> using namespace std; int main(){ int x, y; cin >> x >> y; cout << "x = " << x << endl << "y = " << y << endl; if (x < y) cout << "la première valeur est plus petite" << endl; else cout << "la première valeur est plus grande" << endl; cout << "la seconde valeur est donc plus " << ((x < y)?"grande":"petite") << endl; Résultats d exécution : 10 12 x = 10 y = 12 la premiþre valeur est plus petite la seconde valeur est donc plus grande Le langage C 15
Les itérations while(), for(), do while() #include <iostream> using namespace std; int main(){ int courante, lue; cin >> courante; cout << courante; cin >> lue; cout << ", " << lue; while (lue >= courante && lue!= -1){ courante = lue; cin >> lue; cout << ", " << lue; if (lue == -1) cout << endl << "les valeurs données étaient croissantes..."; else cout << endl << "la suite de valeurs données n'est pas croissante..."; cout << endl; Résultats : 2 4 6 8 10-1 2, 4, 6, 8, 10, -1 les valeurs données étaient croissantes... 2 4 6 5 2, 4, 6, 5 la suite de valeurs données n'est pas croissante... Le langage C 16
Quelques risques #include <iostream> using namespace std; int main(){ // une itération pourrait être éternelle! short x = 0; while (x < 32768) { cout << x << " " x++; Le langage C 17
Résultats (!) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 32762 32763 32764 32765 32766 32767-32768 -32767-32766 -32765-32764 C ne se soucie pas de la qualité des résultats, c est le programmeur qui doit le faire! Le langage C 18
Nouvelle version #include <iostream> using namespace std; int main(){ /* une itération pourrait être éternelle! */ short x = 0; const long limite = 32768; while (x < limite) { cout << x << " "; if (x+1>=limite) { cout << "depassement de capacite"; exit(1); /* ou abort(); */ x++; 32764 32765 32766 32767 depassement de capacité Le langage C 19
Version plus moderne (C++) #include <iostream> using namespace std; int main(){ // une itération pourrait être éternelle! short x = 0; const long limite = 32768; while (x < limite) { cout << x << " "; if (x+1>=limite) throw "depassement de capacite"; x++; garantit le traitement de la situation anormale sans arrêter obligatoirement le programme. Le langage C 20