Apprendre C Une introduction

Vous avez peut-être entendu dire que vous devez connaître Objective-C si vous envisagez de développer des applications iOS. Bien qu'Objective-C soit effectivement un élément important du développement iOS, les utilisateurs ont tendance à oublier qu'Objective-C est un sur-ensemble strict de C. En d'autres termes, il est également important de connaître les principes fondamentaux de C en tant que développeur iOS. Ne t'inquiète pas cependant. Si vous connaissez déjà les bases de la programmation, C ne sera pas trop difficile à comprendre.

Conditions préalables

Il n'est pas possible de couvrir les bases de la programmation et d'apprendre le C en un seul article. Je suppose donc que vous avez déjà une certaine expérience en programmation. Ruby, PHP ou JavaScript sont de bons points de départ pour l'apprentissage de C et d'Objective-C. Si vous venez d'un contexte de développement Web, vous ne devriez pas avoir de problèmes pour apprendre les bases du C en lisant cet article..

Dans cet article, je vais me concentrer sur ce qui rend le C unique ou différent des autres langages de programmation. Cela signifie que je ne couvrirai pas les concepts de base de la programmation et les modèles, tels que les variables et les boucles. Ce que je vais couvrir est la façon dont les variables sont déclarées en C et quels sont les pointeurs. En d’autres termes, l’accent est mis sur ce que vous devez savoir pour vous familiariser avec C.

introduction

Dennis Ritchie a commencé à développer le C à la fin des années 1960 alors qu'il travaillait chez AT & T Bell Labs. Grâce à son utilisation répandue et à sa simplicité de conception, C peut être utilisé sur presque toutes les plateformes. Il n'est lié à aucun système d'exploitation ou plate-forme. Si vous avez exploré d'autres langages de programmation, vous avez peut-être remarqué qu'ils partagent beaucoup de similitudes. De nombreux langages ont été inspirés par C, tels que C #, Java, PHP et Python.

Dennis Ritchie a nommé son nouveau langage C parce qu'il s'inspirait d'un langage antérieur développé par Ken Thompson, appelé B. Malgré le fait que C soit inspiré par des langages sans typage (BCPL de Martin Richards et B par Ken Thompson), C est un langage dactylographié. Je couvrirai la dactylographie plus en détail plus tard dans cet article.

Il ne faut pas longtemps pour apprendre les bases du langage C, car il s’agit d’un langage relativement petit avec seulement un petit ensemble de mots-clés. On pourrait dire que C est très nu et n’offre que ce qui est vraiment nécessaire. D'autres fonctionnalités, telles que les opérations d'entrée / sortie, sont déléguées aux bibliothèques. Le tas et la récupération de place sont absents en C et seule une forme de base de la modularité est possible. Cependant, la petite taille de la langue a l'avantage de pouvoir être apprise rapidement.

Malgré le fait que C soit une langue de bas niveau, il n’est pas difficile d’apprendre ou d’utiliser. De nombreux développeurs iOS et Mac sont tellement habitués à Objective-C et à sa conception orientée objet qu'ils ont peur d'essayer de travailler avec des bibliothèques "droites" C ou C. Objective-C est un sur-ensemble strict de C et rien de plus qu'une couche au-dessus de C.

La pratique rend parfait

La meilleure façon d'apprendre un langage de programmation est de le pratiquer. Nous allons donc créer un nouveau projet dans Xcode et écrire quelques lignes de C pour mieux connaître le langage. Lancez Xcode et créez un nouveau projet en sélectionnant Nouveau> Projet… du Fichier menu.

Nous ne créerons pas d'application iOS comme nous l'avons fait précédemment dans cette série. Au lieu de cela, nous allons créer un OS X projet. Sélectionner Application dans la section intitulée OS X et choisir Outil de ligne de commande forme la liste des modèles à droite. Clique le Suivant bouton pour continuer.

Nommez votre projet Primer C et donnez-lui un nom d'organisation et un identifiant d'entreprise comme nous l'avons vu précédemment. Met le Type menu déroulant à C. La seule option de configuration qui compte vraiment pour ce tutoriel est le type. Ne vous inquiétez pas des autres options pour le moment. Clique le Suivant bouton pour continuer.

Indiquez à Xcode où vous souhaitez enregistrer le nouveau projet Xcode. Il n'est pas nécessaire de créer un référentiel git pour ce projet. Nous n'utiliserons ce projet que pour apprendre le C au lieu de créer un outil de ligne de commande utile..

Aperçu du projet

En comparaison avec l'application iOS que nous avons créée précédemment dans cette série, ce projet est étonnamment minimal. En fait, il ne contient que deux fichiers source, principal c et C_Primer.1. Pour les besoins de l’apprentissage C, seulement principal c nous intéresse. L'extension du fichier, .c, indique qu'il s'agit d'un fichier source C.

Avant de créer et d'exécuter l'outil de ligne de commande, examinons le contenu de principal c. Outre quelques commentaires en haut du fichier et une fonction nommée principale en bas, le fichier source ne contient pas grand chose. Le fichier contient également un comprendre déclaration que je parlerai plus un peu plus tard dans cet article.

// // main.c // C Primer // // Créé par Bart Jacobs le 15/02/14. // Copyright (c) 2014 Tuts +. Tous les droits sont réservés. // #comprendre  int main (int argc, const char * argv []) // insérez le code ici… printf ("Hello, World! \ n"); retourne 0; 

A regarder de plus près le principale Cette fonction révèle quelques caractéristiques intéressantes du langage de programmation C. J'ai mentionné précédemment que C est un langage typé, ce qui signifie que les variables ainsi que les fonctions sont typées. La mise en œuvre de la principale fonction commence par spécifier le type de retour de la fonction, un int. Notez également que les arguments de la fonction sont typés. Le mot clé une fonction, qui est commun dans de nombreuses autres langues, est absent en C.

Le corps du principale la fonction commence par un commentaire (les commentaires d'une seule ligne commencent par //). La deuxième ligne du corps de la fonction est une autre fonction, qui fait partie de la bibliothèque standard C, d'où le #comprendre déclaration en haut du fichier. le printf la fonction envoie la sortie à la sortie standard, "Bonjour le monde! \ N", dans ce cas. le \ n spécifie une nouvelle ligne. Dans Xcode, cependant, la sortie est redirigée vers la console Xcode, dont je parlerai plus dans un peu.

le principale la fonction se termine par le retour 0. Quand un programme revient 0, cela signifie qu'il s'est terminé avec succès. C'est tout ce qui se passe dans le principale une fonction. Ne dérange pas les arguments de la principale fonctionne comme cela sort du cadre de ce tutoriel.

Construire et exécuter

Maintenant que nous savons ce que le principale fonction, il est temps de créer et d’exécuter l’outil en ligne de commande. En construisant l’application, le code en principal c est compilé dans un binaire, qui est ensuite exécuté. Construisez et exécutez l'outil de ligne de commande en cliquant sur le bouton de lecture triangulaire en haut à gauche de la fenêtre..

Si tout se passe bien, Xcode devrait afficher la zone de débogage au bas de la fenêtre. Vous pouvez afficher et masquer la zone de débogage en cliquant sur le bouton du milieu de la Vue contrôle dans la barre d'outils en haut à droite.

La zone de débogage comporte deux sections. À gauche se trouve le Variables fenêtre et à droite est la Console la fenêtre. Dans la console, vous devriez voir les mots Bonjour le monde!. Xcode vous indique également que le programme s'est terminé avec le code de sortie 0, ce qui signifie que le programme s'est terminé normalement.

En un mot

Dans la suite de cet article, je couvrirai les caractéristiques les plus importantes de C. Ce qui est couvert dans ce tutoriel se limite à ce que vous devez savoir pour démarrer avec le développement iOS. Dans le prochain article de cette série, je couvrirai Objective-C.

Contrairement aux langages interprétés, tels que Ruby, PHP et JavaScript, C est un langage compilé. Le code source d'un programme écrit dans un langage compilé est d'abord compilé dans un binaire spécifique à la machine sur laquelle il a été compilé. Le processus de compilation réduit le code source à des instructions compréhensibles par la machine sur laquelle il est exécuté. Cela signifie également qu'il n'est pas garanti qu'une application compilée sur une machine s'exécute sur une autre machine..

Il va sans dire que les programmes écrits dans des langages interprétés doivent également être réduits à des instructions compréhensibles par la machine cible. Ce processus a toutefois lieu pendant l'exécution. Le résultat est que, d’une manière générale, les programmes écrits dans un langage compilé sont plus rapides lorsqu’ils sont exécutés que ceux écrits dans un langage interprété.

Types de données

Une autre différence importante avec des langages tels que PHP, Ruby et JavaScript est que C est un langage typé. Cela signifie que le type de données qu'une variable peut contenir doit être explicitement spécifié. En C, les types de données fondamentaux sont des caractères (carboniser), entiers (int) et des nombres à virgule flottante (flotte). De ces types fondamentaux, un certain nombre de types supplémentaires sont dérivés, tels que double (nombre à double précision en virgule flottante), longue (entier pouvant contenir des valeurs plus grandes), et non signé (entier qui ne peut contenir que des valeurs positives et donc des valeurs plus grandes). Pour une liste complète des types de données C de base, je vous recommande de consulter la page Wikipedia sur les types de données C.

Avez-vous remarqué que les chaînes n'étaient pas mentionnées dans la liste des types de données C de base? Une chaîne de caractères C est stockée sous forme de tableau de caractères. Un caractère peut stocker un caractère ASCII, ce qui signifie qu'un tableau de caractères peut stocker une chaîne. Regardez l'exemple suivant pour voir ce que cela signifie dans la pratique. Les crochets juste après le nom de la variable indiquent qu'il s'agit d'un tableau de caractères. Une chaîne C est terminée par zéro, ce qui signifie que le dernier caractère est 0.

char firstName [] = "Bart";

Explorons la saisie plus détaillée en comparant deux extraits de code. Le premier extrait de code est écrit en JavaScript, alors que le deuxième extrait est en C. var mot-clé. C n'a pas de mot clé pour déclarer des variables. Au lieu de cela, une variable en C est déclarée en la préfixant avec un type de données, tel que int ou carboniser.

var a = 5; var b = 13,456; var c = 'a';
int a = 5; float b = 13,456; char c = 'a';

Introduisons quelques variables dans le principale fonction que nous avons vu plus tôt. Changer le corps de la principale pour ressembler à l'extrait de code ci-dessous. Pour imprimer les variables en utilisant le printf fonction, nous utilisons spécificateurs de format. Pour une liste plus complète des spécificateurs de format disponibles, visitez ce lien.

int main (int argc, const char * argv []) // insérez le code ici… printf ("Hello, World! \ n"); // Variables int a = 5; float b = 6,3; char c = 'r'; printf ("ceci est un entier:% i \ n", a); printf ("ceci est un float:% f \ n", b); printf ("ceci est un caractère:% c \ n", c); retourne 0; 

Comme nous l'avons vu précédemment, en C, la frappe ne se limite pas à des variables. Les fonctions doivent également spécifier le type qu'elles renvoient ainsi que le type des arguments qu'elles acceptent. Voyons comment cela fonctionne.

Les fonctions

Je suppose que vous connaissez déjà les fonctions. Comme dans d'autres langages, une fonction C est un bloc de code qui effectue une tâche spécifique. Faisons principal c plus intéressant en introduisant une fonction. Avant le principale fonction, nous avons ajouté un prototype de fonction. Il indique au compilateur la fonction, le type renvoyé et les arguments acceptés. En bas de principal c, on insère l'implémentation de la fonction. La fonction ne fait que multiplier par cinq l'argument transmis à la fonction et renvoyer le résultat..

#comprendre  int multiplyByFive (int a); // Fonction Prototype int main (int argc, const char * argv []) // insère le code ici… printf ("Hello, World! \ N"); // Variables int a = 5; float b = 6,3; char c = 'r'; printf ("ceci est un int>% i \ n", a); printf ("ceci est un float>% f \ n", b); printf ("ceci est un caractère>% c \ n", c); // Fonctions printf ("Cinq multiplié par cinq est% i \ n", multiplyByFive (5)); retourne 0;  int multiplyByFive (int a) retourne a * 5; 

Nous avons également mis à jour le principale fonction en invoquant le multiplyByFive une fonction. Notez qu'un prototype de fonction n'est pas strictement nécessaire à condition que l'implémentation de la fonction soit placée avant qu'elle ne soit appelée pour la première fois. Cependant, l’utilisation de prototypes de fonctions est utile car elle permet aux développeurs de répartir le code source sur plusieurs fichiers et de garder ainsi un projet organisé..

Si une fonction ne renvoie pas de valeur, le type de retour est déclaré comme vide. En substance, cela signifie qu'aucune valeur n'est renvoyée par la fonction. Regardez l'exemple suivant. Notez que la fonction n'accepte aucun argument. Les parenthèses après le nom d'une fonction sont obligatoires même si la fonction n'accepte aucun argument.

// Prototype de fonction void helloWorld (); // Implémentation de la fonction void helloWorld () printf ("Hello, World! \ N"); 

Avant de poursuivre, je tiens à mentionner que la langue C n’a pas de une fonction mot clé pour déclarer une fonction comme en JavaScript ou en PHP. Les parenthèses après le nom de la fonction indiquent que Bonjour le monde est une fonction. La même chose est vraie pour les variables que j'ai mentionnées plus tôt. En préfixant un nom de variable avec un type, le compilateur sait qu'une variable est en train d'être déclarée.

Vous vous demandez peut-être quels sont les avantages d'un langage typé, tel que le langage C. Pour les programmeurs utilisant Ruby ou PHP, l'apprentissage d'un langage typé risque de semer la confusion. Le principal avantage de la frappe est que vous devez être explicite sur le comportement du programme. La détection des erreurs lors de la compilation est un avantage majeur, comme nous le verrons plus loin dans cette série. Même si C est un langage typé, ce n'est pas un langage fortement typé. La plupart des compilateurs C fournissent des conversions implicites (par exemple, une carboniser qui est converti en un int).

Des structures

Qu'est-ce qu'une structure? Permettez-moi de citer Kernighan et Ritchie. Une structure est un ensemble d'une ou de plusieurs variables, éventuellement de types différents, regroupées sous un même nom pour faciliter leur traitement.. Regardons un exemple pour voir comment fonctionnent les structures. Ajoutez l'extrait de code suivant juste avant le principale les fonctions revenir déclaration.

// Structures struct Album int year; pistes int; ; struct Album myAlbum; struct Album yourAlbum; monAlbum.année = 1998; myAlbum.tracks = 20; votreAlbum.année = 2001; votreAlbum.tracks = 18; printf ("Mon album a été publié dans% i et avait% i pistes. \ n", myAlbum.year, myAlbum.tracks); printf ("Votre album a été publié dans% i et avait% i pistes. \ n", votreAlbum.année, votreAlbum.tracks);

Nous commençons par déclarer un nouveau type de structure et nous lui donnons le nom suivant: Album. Après avoir déclaré le nouveau type, nous l'utilisons en spécifiant que la variable que nous sommes sur le point de déclarer est une structure et en spécifiant le nom de la structure., Album. La notation par points est utilisée pour assigner des valeurs aux variables que la structure contient et pour lire les valeurs.

Pointeurs

Les pointeurs sont souvent une pierre d'achoppement pour ceux qui veulent apprendre le C. La définition d'un pointeur est cependant très simple. Un pointeur est une variable qui contient une adresse mémoire. Gardez à l'esprit qu'un pointeur est simplement un autre type de données C. Les pointeurs sont mieux compris avec un exemple. Collez le code suivant immédiatement avant le revenir déclaration du principale une fonction.

// pointeurs int d = 5; int * e = & d; printf ("d a la valeur% i \ n", d); printf ("e a la valeur% p \ n", e); printf ("l'objet sur lequel e pointe du doigt a la valeur% i \ n", * e);

Nous commençons par déclarer un int et lui attribuer une valeur. Dans la ligne suivante, nous déclarons un pointeur sur int nommé e en préfixant le nom de la variable avec un astérisque. L'esperluette avant la variable est un opérateur unaire (un nom de fantaisie pour un opérateur ayant un opérande) connu sous le nom d'adresse-d'opérateur. En d'autres termes, en préfixant la variable avec une esperluette, notre pointeur e est donné pas la valeur de , mais l'adresse en mémoire où la valeur de est stocké. Rappelez-vous la définition d'un pointeur, c'est une variable qui contient l'adresse d'une variable.

Les instructions print après les déclarations de variables rendront cet exemple plus clair. Générez et exécutez l'exemple, puis inspectez la sortie dans la console. La valeur de est 5 comme on s'y attend. La deuxième déclaration d'impression pourrait vous surprendre. Le pointeur nommé e contient une adresse mémoire, le lieu en mémoire où la valeur de est stocké. Dans la déclaration finale, nous utilisons un autre opérateur unaire, l’opérateur de déréférencement ou indirection. Ce que fait l'opérateur, c'est accéder à l'objet stocké à l'emplacement indiqué par le pointeur. En d’autres termes, en utilisant l’opérateur de déréférencement, nous récupérons la valeur de .

N'oubliez pas que lorsqu'une variable est déclarée dans le langage de programmation C, un bloc de mémoire est alloué pour cette variable. Un pointeur pointe simplement sur ce bloc de mémoire. En d'autres termes, il contient une référence à la variable stockée dans le bloc de mémoire. Assurez-vous de bien comprendre le concept de pointeurs avant de passer au prochain article dans lequel nous examinons Objective-C. Les pointeurs sont utilisés tout le temps lorsque vous travaillez avec des objets.

Ne vous inquiétez pas si les pointeurs n’ont pas de sens immédiatement après avoir lu cet article. Il faut souvent un certain temps pour bien comprendre le concept. Il y a un excellent article écrit par Peter Hosey que je ne peux pas recommander assez.

Attention au point-virgule

Il semble que les points-virgules ne soient plus branchés. Ruby n'aime pas beaucoup les points-virgules et CoffeeScript, le nouvel enfant cool de la ville, ne les aime pas non plus. En C et en Objective-C, des points-virgules sont requis à la fin de chaque instruction. Le compilateur n'est pas très tolérant, comme vous l'avez peut-être remarqué.

Conclusion

Le langage de programmation C ne se limite pas à ce que j'ai décrit dans cet article. Dans le prochain article, cependant, je parlerai d'Objective-C et cela améliorera progressivement votre compréhension de C. Une fois que nous aurons commencé à travailler avec le SDK iOS, je suis sûr que vous maîtriserez mieux les objets et les pointeurs. pas le temps.