praktischer Weg, um C zu lernen? [geschlossen]

10

Ich möchte mich mit C beschäftigen und normalerweise, wenn ich eine neue Sprache lernen möchte, denke ich an ein einfaches / erreichbares Projektziel, das einen praktischen Zweck hat (eine API verwenden, eine Aufgabe automatisieren usw.)

Es fällt mir schwerer, eine für C zu finden, vor allem, weil alles, was ich lese, darauf hinweist, dass C derzeit hauptsächlich in eingebetteten Systemen und komplexeren Softwareprojekten wie Betriebssystemen verwendet wird.

Weist mich das darauf hin, dass ich es nicht lernen muss oder dass ich in meiner Lernstrategie nur ein bisschen komplizierter sein muss?

Verweise auf praktische Lernressourcen? (Tutorial / wie das geht, ergibt ein Endergebnis, das einen Zweck / Nutzen hat)

jondavidjohn
quelle
3
Sie erhalten vernünftigere Antworten, wenn Sie uns sagen können, WARUM Sie C lernen möchten?
Zvrba
2
Ich stimme zvrba zu. C eignet sich hervorragend für einfache, schnelle Inhalte und für Treibercode. Wenn Sie Code für Spiele schreiben, ist das auch großartig (obwohl Sie wahrscheinlich mit C ++ - Codierern arbeiten würden, die sich bei Ihnen beschweren, wenn Sie "nicht standardmäßigen" Code schreiben). Ich habe jedoch das Gefühl, dass Assembly und C Latein (in gesprochenen Sprachen) ähnlich sind, sie waren nicht die ersten, aber die meisten, die nach ihnen kamen, verwendeten die Ideen und Konstrukte aus ihnen, um ihre eigenen Sprachen zu erstellen. Wenn Sie also C MIGHT studieren , erhalten Sie ein besseres Verständnis für höhere Sprachen
Jamie Taylor,
Haben Sie Zed Shaw ausgecheckt Erfahren C The Hard Way . Ungefähr so ​​praktisch wie möglich und auch ganz kostenlos.
Wyatt Barnett
Die Person Python the Hard Way hat jetzt Bücher für andere Sprachen, einschließlich einer Alpha-Version für C, ich würde dort anfangen. C ist auf hohem Niveau ein großer Unterschied zu asm, ich hasse den Vergleich zu asm, da er falsch ist. Relativ sicher, dass Sie damit das tun können, was andere Sprachen nicht tun. Es spielt keine Rolle, was Sie für eine Anwendung erstellen möchten, die Sie in C schreiben können, kein Grund, die Anwendung auf die Sprache auszurichten.
old_timer

Antworten:

27

Ich würde nur empfehlen, eine Kopie von Kernighan und Ritchies The C Programming Language (2nd Edition) zu kaufen . Am Ende jedes Kapitels finden Sie eine Reihe von Übungen, die Sie ausführen können, sowie eine sehr gute Einführung in die C-Sprache. Es wird Sie nicht zum Meister der Sprache machen, aber Sie sollten am Ende des Buches und der Übungen ein ausreichendes Verständnis haben, um vielleicht ein in C geschriebenes Open-Source-Projekt zu finden , zu dem Sie die Quelle lesen und vielleicht einen Beitrag leisten können zu.

Wenn Sie aktuelle Projekte mit C-Code sehen möchten. Es wird immer schwieriger - viele Projekte verwenden eine "höhere" Sprache, aber C ist noch am Leben und munter. Wenn Sie C lernen möchten, haben Sie keine Angst, das Rad neu zu erfinden, um das Lernen zu erreichen. Es ist keine gute Idee, Lösungen auf der Uhr neu zu erfinden, aber es ist vollkommen in Ordnung, dies als akademische Übung zu tun.

Thomas Owens
quelle
1
Fügen Sie dazu die FAQ aus comp.lang.c hinzu. c-faq.com
Mike Sherrill 'Cat Recall'
3
+1 für nichts dagegen, Lösungen neu zu erfinden, um zu lernen.
Ein CVn
4
K & R ist schrecklich für das Erlernen eines guten Programmierstils im Allgemeinen und für das Unterrichten sicherer / vernünftiger C-Programmierpraktiken im Besonderen. Alle darin enthaltenen Codefragmente sind bestenfalls verschleiert, meistens lehren sie geradezu gefährliche Gewohnheiten. Es ist ein veraltetes Buch, ich würde es nicht für etwas anderes als Nostalgie empfehlen. Es ist besonders für Anfänger geeignet.
2
@ Thomas Ja die 2. Auflage. Sie können so ziemlich jeden Code-Ausschnitt daraus zitieren, und ich kann wahrscheinlich auf 2-3 gefährliche / schlechte Übungsfälle hinweisen. Ich werde das Buch jetzt öffnen und ein zufälliges Beispiel auswählen. Ok, los geht's, S. 119: Zuweisung innerhalb von Bedingungen, Verwendung nativer primitiver Datentypen, Verwendung von implizitem int (ohne Vorzeichen), Typisierung des Ergebnisses von malloc (sehr schlecht!), Typisierung des Parameters auf free to void * (warum ??? ), mehrere Rückgaben (auch bekannt als Spaghetti), wobei NULL ohne richtiges #include verwendet wird, wenn ohne {}.
2
+ 1für KnR C. Es ist die beste (und prägnanteste) Einführung in die Programmierung in einer bestimmten Sprache, die ich je gelesen habe. Wie andere bereits betont haben, kann es an manchen Stellen etwas zweifelhaft sein - der einzige Ratschlag, den ich geben würde, lautet: Wenn es jemals ein Programmierhandbuch gab, in dem Sie den umgebenden Klappentext lesen mussten, ist dies der richtige. Andere können Sie normalerweise aus dem Codeblock herausfinden, aber dieses Buch erfordert, dass Sie es mindestens einmal vollständig lesen.
Jamie Taylor
1

Sie müssen die Speicherzuordnung wirklich verstehen. Sie klingen, als hätten Sie bereits andere Sprachen verwendet, aber es besteht die Möglichkeit, dass diese anderen Sprachen die wichtigsten Details der Speicherverwaltung vor Ihnen verborgen haben. In C ist die Speicherverwaltung immer explizit. Dies hat einige Vorteile, aber es bedeutet, dass Sie vorsichtig sein müssen, um es richtig zu machen, sonst bricht die Hölle los.

Verwenden Sie die für die von Ihnen verwendete Plattform verfügbaren Speicher-Debugging-Funktionen. Für Linux gibt es Electric Fence, für Mac OS X Guard Malloc. Es gibt auch Valgrind, das eine Reihe von Betriebssystemen unterstützt.

Wenn Sie den freizugebenden Speicher nicht freigeben können, liegt ein Speicherverlust vor. Wenn Sie das weiter machen, wird Ihnen der Speicher ausgehen. Selbst mit dem Sicherungsspeicher (was die meisten Leute als virtuellen Speicher bezeichnen) können Sie dazu führen, dass das System übermäßig blättert oder sogar nicht mehr genügend Speicherplatz zur Verfügung steht.

Wenn Sie bereits freigegebenen Speicher freigeben, beschädigen Sie den Heap und stürzen ab, aber wahrscheinlich nicht sofort. Sie beschädigen den Heap auch, wenn Sie einen Puffer überlaufen. Die Speicher-Debugging-Tools helfen bei all diesen Problemen.

Unit-Tests helfen auch.

Mike Crawford
quelle
0

Ich stimme den meisten Menschen hier zu, dass die heutigen Sprachen von der jeweiligen Aufgabe bestimmt werden. Es gab eine Zeit, in der Sie diesbezüglich nur eine begrenzte Auswahl hatten. Heutzutage wird C hauptsächlich in der Programmierdomäne Embedded / System verwendet, in der Codeoptimierung erforderlich ist. Sie müssen präzise Codes schreiben, um das Maximum zu erreichen, denn wenn Sie jemals anfangen, diese Abstraktion zu verwenden, muss das zugrunde liegende Material sehr robust sein. Ich würde sagen, Sie versuchen, einige Open-Source-GNU-Projekte wie Linux selbst oder etwas, das C-Entwickler benötigt, zu umgehen. Versuchen Sie sich in diesen Projekten, anstatt in C etwas von Grund auf neu zu schreiben. Dies ist wahrscheinlich der bessere Weg, um Codes zu schreiben und eine Sprache zu lernen.

Nishant
quelle
Eigentlich bezweifle ich, dass es ein guter Weg ist, eine Sprache von Grund auf neu zu lernen, wenn man mit dem Kopf voran in ein etabliertes, wenn auch kleines Projekt einspringt. Sie werden wahrscheinlich über Ihren Kopf hinweg in die Quere kommen und müssen zusätzlich einfach versuchen, durch den Code zu navigieren, selbst wenn Sie nur verstehen möchten , wie der Code funktioniert. Insbesondere ein Betriebssystemkern ist eine unglaublich komplexe Software.
Ein CVn
Ja, aber ich gehe davon aus, dass der Fragesteller tatsächlich das K & R-Buch oder ähnliches durchgesehen hat. Dieser Ansatz wurde mir empfohlen, als ich im Python-Kanal nachfragte. Wäre es anders in C?
Nishant
Genau genommen weiß ich nicht, ob es so viel anders wäre, aber in C müssen Sie den Details viel mehr Aufmerksamkeit schenken als in einer Hochsprache wie Python. Speicherverwaltung, um nur eines zu erwähnen . Der Einstieg in ein etabliertes, potenziell großes Projekt, wenn Sie gerade erst mit einer Sprache beginnen, ist möglicherweise nicht der beste Weg, dies zu tun.
Ein CVn
0

Sie möchten etwas tun, das über die Befehlszeile funktioniert. Die GUI-Programmierung in C ist selbst bei einem guten GUI-Framework ein großes Problem.

Mein üblicher Vorschlag für eine praktische C-Lernerfahrung war eine Kontaktliste oder eine andere einfache Datenverwaltungs-App. Dies deckt die meisten wichtigen Elemente ab (E / A, Speicherverwaltung, Textverarbeitung usw.), und Sie müssen nichts außerhalb der Standard-C-Bibliothek verwenden, um dies zu erreichen. C bietet keine integrierte Unterstützung für Grafik, Netzwerk, Sound oder vieles mehr 1. Vermeiden Sie daher bei Ihrem ersten Einstieg in die C-Programmierung alles, was auf solchen Dingen beruht.

C kann für die allgemeine Programmierung verwendet werden; Sie müssen nur Ihre Erwartungen etwas senken (stellen Sie sich vor, es ist 1983 und Sie sitzen vor einem VT52, der an einen VAX 11/750 angeschlossen ist, und Sie sind in der richtigen Einstellung).

Denken Sie daran, C hat keine Klingenschutzvorrichtungen und hindert Sie nicht daran, etwas Dummes zu tun. Die Sprachdefinition ist stellenweise etwas locker, und es gibt einige Operationen, die als solche nicht illegal , aber auch nicht genau definiert sind.


1 - Die neueste (2011) Überarbeitung des Sprachstandards hat eine integrierte Threading-Unterstützung hinzugefügt

John Bode
quelle
0

Ich empfehle Project Euler . Ich habe es verwendet, um mein C ++ zu verbessern und es ist fantastisch. Es ist großartig, weil jedes Problem eine kleine Aufgabe ist, die weniger als eine Stunde dauern kann (zumindest die ersten).

Sie benötigen einen Profiler und ein Buch über die Optimierung des Codes für die Geschwindigkeit. Halten Sie sich unbedingt an die 1-Minuten-Regel: Sie müssen die Antwort innerhalb von 1 Minute erhalten.

B Sieben
quelle
0

Wenn Sie bereits ein Programmierer sind, und müssen nur lernen , C, und nichts dagegen eine ältere Version der Sprache zu lernen (der Kern ist immer noch so ziemlich das gleiche), dann Leendert Ammeraal des „C für Programmierer“ nicht zu schlagen . Arbeiten Sie es durch, von Anfang bis Ende.

John R. Strohm
quelle