moyen pratique d'apprendre le C? [fermé]


10

Je veux creuser en C et normalement quand je veux apprendre un nouveau langage, je pense à un objectif de projet simple / réalisable qui a un but pratique (utiliser une API, automatiser une tâche, etc ...)

J'ai plus de mal à en trouver un pour C, principalement parce que tout ce que je lis indique que l'utilisation principale de C se trouve actuellement dans les systèmes embarqués et les projets logiciels plus complexes comme les systèmes d'exploitation.

Est-ce que cela m'indique que je n'ai pas besoin de l'apprendre ou que je dois juste être un peu plus compliqué dans ma stratégie d'apprentissage?

Références à des ressources d'apprentissage pratiques? (tutoriel / comment cela produit un résultat final qui a un but / un avantage)


3
Vous obtiendrez des réponses plus sensées si vous pouvez nous dire POURQUOI voulez-vous apprendre le C?
zvrba

2
Je suis d'accord avec zvrba. C est idéal pour les choses rapides et de bas niveau et pour le code du pilote. Si vous écrivez du code pour les jeux, c'est aussi génial (bien que vous travailliez probablement avec des codeurs C ++ qui se plaindront de vous pour avoir écrit du code "non standard"). Je pense cependant que Assembly et C sont similaires au latin (dans les langues parlées), ils n'étaient pas les premiers, mais la plupart qui les ont suivis ont utilisé les idées et les constructions à partir d'eux pour créer leurs propres langues. Ainsi, étudier C MIGHT vous permettra de mieux comprendre les langues de niveau supérieur
Jamie Taylor

Avez-vous vérifié Learn C The Hard Way de Zed Shaw . À peu près aussi pratique que possible, et assez gratuit aussi.
Wyatt Barnett

la personne Python the Hard Way a maintenant des livres pour d'autres langues, y compris une version alpha pour C, je commencerais par là. C est de haut niveau une grande différence avec asm, je déteste la comparaison avec asm car c'est faux. Relativement sûr, il vous permet de faire ce que les autres langues ne font pas. Peu importe ce que vous voulez faire, vous pouvez écrire une application en C, aucune raison de cibler l'application sur la langue.
old_timer

Réponses:


27

Je recommanderais simplement de prendre une copie du langage de programmation C de Kernighan et Ritchie (2e édition) . Il contient un certain nombre d'exercices à la fin de chaque chapitre que vous pouvez faire, ainsi qu'une très bonne introduction au langage C. Cela ne fera pas de vous un maître de la langue, mais vous devriez avoir une assez bonne compréhension à la fin du livre et des exercices afin de peut-être trouver un projet open source écrit en C que vous pourriez lire la source et peut-être contribuer à.

Si vous voulez voir des projets réels avec du code C dedans. Cela devient plus difficile - de nombreux projets utilisent un langage de "niveau supérieur", mais C est toujours vivant et dynamique. Si vous voulez apprendre le C, n'ayez pas peur de réinventer la roue pour réussir l'apprentissage. Ce n'est pas une bonne idée de réinventer des solutions sur l'horloge, mais c'est parfaitement bien de le faire comme un exercice académique.


1
Ajoutez à cela la FAQ de comp.lang.c. c-faq.com
Mike Sherrill 'Cat Recall'

3
+1 pour ne pas déranger de réinventer des solutions pour apprendre.
un CV

4
K&R est horrible pour apprendre un bon style de programmation en général, et horrible pour enseigner des pratiques de programmation C sûres / saines en particulier. Tous les extraits de code qu'il contient sont au mieux obscurcis, la plupart du temps ils enseignent des habitudes carrément dangereuses. C'est un livre dépassé, je ne le recommanderais pour rien au-delà de la nostalgie. Il est particulièrement inapproprié pour les programmeurs débutants.

2
@Thomas Oui la 2e édition. Vous pouvez en citer à peu près n'importe quel extrait de code et je peux probablement y signaler 2-3 cas de pratique dangereux / médiocre. Je vais ouvrir le livre dès maintenant et choisir un exemple aléatoire. Ok on y va, p119: affectation à l'intérieur de conditions, utilisation de types de données primitifs natifs, utilisation d'un int implicite (non signé), transtypage du résultat de malloc (très mauvais!), Transtypage du paramètre pour libérer pour annuler * (pourquoi ??? ), plusieurs retours (aka spaghetti), en utilisant NULL sans #include approprié, si sans {}.

2
+ 1 pour KnR C. C'est la meilleure (et la plus concise) introduction à la programmation dans un langage spécifique que j'aie jamais lu. Comme d'autres l'ont souligné, cela peut être un peu douteux par endroits - le seul conseil que je donnerais est le suivant: s'il y a déjà eu un manuel de programmation qui vous obligeait à lire le texte de présentation environnant, c'est bien celui-ci. D'autres, vous pouvez généralement le comprendre à partir du bloc de code, mais ce livre nécessite que vous le lisiez de bout en bout, au moins, une fois.
Jamie Taylor

1

Vous devrez vraiment comprendre l'allocation de mémoire. Vous semblez avoir utilisé d'autres langues auparavant, mais il est probable que ces autres langues vous aient caché les détails sanglants de la gestion de la mémoire. En C, la gestion de la mémoire est toujours explicite. Il y a quelques avantages à cela, mais cela signifie que vous devez faire attention à bien faire les choses, sinon tout l'enfer se déchaînera.

Utilisez les fonctionnalités de débogage de mémoire disponibles pour la plate-forme que vous utilisez. Pour Linux, il y a Electric Fence, sur Mac OS X, il y a Guard Malloc. Il existe également Valgrind qui prend en charge un certain nombre de systèmes d'exploitation.

Si vous ne parvenez pas à libérer de la mémoire qui devrait être libérée, vous aurez une fuite de mémoire. Continuez ainsi et vous manquerez de mémoire. Même avec le stockage de sauvegarde (ce que la plupart des gens appellent la mémoire virtuelle), vous pouvez provoquer une page excessive du système ou même manquer d'espace d'échange.

Si vous libérez de la mémoire qui a déjà été libérée, vous corromprez le tas et vous planterez, mais probablement pas tout de suite. Vous corromprez également le tas si vous dépassez un tampon. Les outils de débogage de la mémoire vous aideront avec tout cela.

Les tests unitaires sont également utiles.


0

Je suis d'accord avec la plupart des gens ici qu'aujourd'hui, les langues sont déterminées par la tâche à accomplir. Il fut un temps où vous aviez un choix limité à cet égard. Aujourd'hui, C est principalement utilisé dans le domaine de programmation Embedded / System où il existe un besoin d'optimisation de code. Vous devez écrire des codes précis pour obtenir le maximum, car si jamais vous commencez à utiliser cette abstraction, le contenu sous-jacent doit être très robuste. Je dirais que vous essayez de contourner certains projets GNU open source comme Linux lui-même ou quelque chose qui nécessite des développeurs C. Essayez-vous dans ces projets au lieu d'écrire quelque chose à partir de zéro en C. C'est probablement la meilleure façon d'écrire des codes et d'apprendre une langue.


En fait, je doute que sauter la tête la première dans un projet établi, même mineur, est un bon moyen de commencer à apprendre une langue à partir de zéro. Vous êtes susceptible d'entrer en chemin sur votre tête, et aura également la charge supplémentaire de simplement essayer de naviguer dans le code, même si tout ce que vous mettez à faire est de comprendre le fonctionnement du code. Un noyau de système d'exploitation en particulier est un logiciel incroyablement complexe.
un CV

Oui, mais je suppose que la personne qui a posé la question est passée par le livre K&R ou quelque chose comme ça. On m'a recommandé cette approche lorsque j'ai demandé dans le canal Python. Serait-ce différent en C?
Nishant

Strictement parlant, je ne sais pas si ce serait si différent, mais en C, vous devez faire beaucoup plus attention aux petits détails que dans un langage de haut niveau comme Python. Gestion de la mémoire, pour ne citer qu'une chose. Se lancer dans un projet établi et potentiellement volumineux lorsque vous débutez avec une langue n'est peut-être pas la meilleure façon de le faire.
un CVn

0

Vous allez vouloir faire quelque chose qui peut fonctionner à partir de la ligne de commande. La programmation GUI en C est une douleur majeure dans le cul, même avec un bon cadre GUI.

Ma suggestion habituelle pour une expérience d'apprentissage C pratique a été une liste de contacts ou une autre application de gestion de données simple. Cela couvrira la plupart des bits importants (E / S, gestion de la mémoire, traitement de texte, etc.), et vous n'aurez rien à utiliser en dehors de la bibliothèque C standard pour l'accomplir. C n'a pas de support intégré pour les graphiques, la mise en réseau, le son ou bien d'autres choses 1 , donc pour votre première incursion dans la programmation C, il est préférable d'éviter tout ce qui repose sur ce genre de choses.

C peut être utilisé pour la programmation à usage général; il vous suffit de réduire quelque peu vos attentes (imaginez que nous sommes en 1983 et que vous êtes assis devant un VT52 attaché à un VAX 11/750, et vous serez dans la bonne mentalité).

N'oubliez pas que C n'a pas de protège-lame et ne vous empêchera pas de faire quelque chose de stupide. La définition du langage est un peu lâche par endroits, et certaines opérations ne sont pas illégales en tant que telles, mais ne sont pas bien définies non plus.


1 - La dernière révision (2011) de la norme de langue a ajouté la prise en charge intégrée du filetage


0

Je recommande Project Euler . Je l'ai utilisé pour améliorer mon C ++ et c'est génial. C'est génial car chaque problème est une petite tâche qui peut prendre moins d'une heure (au moins les premiers).

Vous aurez besoin d'un profileur et d'un livre sur l'optimisation du code pour la vitesse. Assurez-vous de respecter la règle de 1 minute: vous devez obtenir la réponse en 1 minute.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.