Beste Möglichkeit C zu lernen

EgoMania

Member
Hallo,

Ich bin derzeit auf der Suche nach der effektivsten Möglichkeit C zu lernen.
Programmiergrundlagen sind prinzipiell vorhanden (loops, if...else, switch, Datentypen, logische Operatoren etc.).

Leider finde ich nicht unbedingt ein Buch, welches mir zusagt.

Hatte mal mit 'C von A bis Z' von Jürgen Wolf geliebäugelt, jedoch scheinen seine Bücher ziemlich zu polarisieren.
Und viele Leute raten von seinen Büchern für Anfänger dringend ab.

Gibt es irgendwelche Werke, die gut in C einführen und ggf. auch weiterführende Themen behandeln bzw darauf verweisen?

Vielen Dank!
 
Dass Bücher nicht so zusagen kenne ich, aber wichtig ist halt trotzdem mal sich ein wenig reinzulesen und was ganz kleines, simples zu bauen und Code in bestehenden Projekten zu lesen und sich "zu spielen".

Welches Buch dir zusagt musst du aber selbst rausfinden. Nur sei soviel gesagt, dass Bücher numal auch ihre Schwächen, Limits, etc. haben. Aber sobald du mal weißt wie's grundsätzlich geht und du selbst was bauen kannst bzw. einfach mal Code verstehst und lesen kannst wirst du auch den Punkt erreichen wo du weißt was an deinem Buch schlecht war und was gut.

Programmieren aus einem Buch lernen ist so wie Autofahren oder so aus einem Buch zu lernen. Da gibt es den theoretischen Teil, aber nur weil du weißt was da drin steht macht dich das noch nicht zu einem guten Programmierer. Oder sieh's wie ganz generell den Umgang mit dem Computer. Da hast du auch wenn du die aller grundlegenden Dinge beherrscht mehr davon wenn du dich einfach mal damit spielst, ein wenig erforscht, etc. Wenn du die grundlegenden Dinge kannst überlege dir wohin du willst, was du programmieren willst und wenn du dazu eine Lücke hast, dann versuch sie entweder durch probieren oder durch lesen zu schließen.

Das Problem bei weiterführenden Themen ist, dass die in alle möglichen Richtungen gehen. Das Wissen ist nicht linear strukturiert, zuerst das, dann das, dann das sondern wenn du GUIs machen willst, dann musst du dich für Qt oder Gtk, Wx oder sonst was entscheiden. Wenn du Netzwerk-Access haben willst dann eben das. Scientific Computing, OS-Entwicklung (Treiber, etc.), Text Analyse, Datenanken, Grafik, Compilerbau, etc. Da gibt es so viel und quasi alles kann man zusammenstöpseln.

Es ist meiner Meinung wichtig mal ein Projekt zu haben und sich beim Implementieren mal die Zähne auszubeißen. Das hilft. Nur nicht aufgeben. :)
 
Ich habe bis jetzt erst mal ein Buch "durchgelesen/durchgearbeitet" und muss sagen, auch wenn ich erst mal diesen Kack-Techni-Deutsch entwirren musste, nach 500 Seiten hat man sich daran gewöhnt. :)
In meinen Augen gibts keine wirklich guten Bücher.
Am besten du nimmst dir irgendeins, was über 500 Seiten hat, da machst du schon nichts verkehrt. :)

Meine Vorgehensweise ist, einfach alles was ich zu C kriegen kann zu lesen. Auch wenn sich dann vieles wiederholt, vielleicht lernt man doch was neues.
Da ja kein Buch kein Tutorial auf Vollständigkeit einen Wert legen, was ziemlich mies ist.

Programmiergrundlagen sind prinzipiell vorhanden (loops, if...else, switch, Datentypen, logische Operatoren etc.).
Nun ja, das ist sozusagen das 1 * 1 für Drittklässler. Damit kann man nicht gerade viel machen, was ich ja bei mir feststellen musste.

Sonst würde ich mir einen suchen, der auch C lernen will ;)
Von einander lernt sich besser als nur von einem Buch.

Ansonsten, viel Code lesen und sogar wiederholt lesen.

Gruß
 
Ich halte Kernighan & Ritchie immer noch für die beste Einführung. Vollständigkeit kannst du aus den Gründen die Athaba genannt hat nicht erwarten. Ich fand zudem Expert C Programming von Peter van der Linden (engl.) sehr gut.

Ansonsten selbst programmieren, den Code von anderen lesen und alles lesen was du in die Finger bekommst. Nach einiger Zeit weißt du nach was du gezielt suchen mußt. Und schau dir die Dokus der Compiler an, z.B. https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/ Clang ist weitgehend identisch.
 
Ich halte Kernighan & Ritchie immer noch für die beste Einführung.
Ich bin jetzt dabei und kann bestätigen, dass dieses Buch noch ziemlich gut geschrieben ist. Und nicht so geschwollen daher kommt.
2te Ausgabe dann aber kaufen!

Ich fand zudem Expert C Programming von Peter van der Linden (engl.) sehr gut.
Frag mich, wie viel englisch musstest du dafür können?
 
Wenn man Englisch kann sind englische Bücher ganz generell zu empfehlen. Selbst nicht gelesen, aber habe gutes über 21st Century C gehört. Nur denke ich eben, dass man um guten Code lesen nicht herum kommt, wobei man eben dann wirklich auch guten Code lesen sollte, nicht unbedingt von jemanden, der auch gerade beginnt. Code-By-Example ist zwar auch nett für's verstehen lernen, aber eben auch meist kein so alltäglicher, realistischer Code, also wirklich auch schauen, dass man, auch wenn es oft viel ist Code von tatsächlichen Projekten liest.

Ich bin kürzlich über einen Reddit-Thread mit Links zu Projekten gestolpert, die guten Code haben. Da werden unter anderem Standard Libraries und zum Beispiel djb's Code empfohlen. Ansonsten sitzt man ja auf einem BSD mit einer netten libc und vor allem vielen kleinen, praktischen Tools, die meist ganz gut programmiert sind.

Trotzdem möchte ich anmerken, dass das auch wenn man es sicher gleichzeitig machen kann und soweit möglich auch sollte man sich anfangs auch nicht damit verheddern sollte gleich optimalen, perfekt designten Code zu schreiben. Zum Einen sollte man zunächst mal die Sprache verstehen und zum Anderen kommt man dann schnell mal zu Over-Engineering und zu Dogmen, die beide nicht unbedingt gut sind.

Faustregel: Wenn der Code eurer Meinung zwar nahezu perfekt ist und all die coolen Tricks, Patterns, Guidelines, etc. verwendet, er aber von einem dritten nicht einfach zu lesen ist, dann läuft was ziemlich falsch.

Das habe ich schon öfters gesehen. Jemand lernt einen Trick und verwendet ihn dann die ganze Zeit, auch wenn es keinen Sinn macht und den Code schwer zu lesen macht. So etwas produziert auf lange Sicht schwer auffindbare Bugs und sorgt dafür, dass anderen das mitentwickeln erschwert wird.
 
Zuletzt bearbeitet:
Frag mich, wie viel englisch musstest du dafür können?
Nicht so viel, aber auch nicht ganz wenig. ;) Mit ein wenig Basis-Wissen und der Hilfe von Leo sollte das gehen. Technische Literatur ist ja meist sprachlich recht eindeutig und einfach wenn man die Terminologie in etwa kennt.

Ich denke auch dass Beispiele aus lang gepflegten und bewährten Projekten gut zum lernen geeignet sind: Lua, SQLite, qmail etc. Das Problem dürfte hier sein den Gedammtzusammenhang zu verstehen. Vielleicht sind da Basis-Biblotheken besser geeignet wie z.B. https://github.com/stevedekorte/basekit/tree/master/source
 
Sobald Du die Syntax grob raus hast findest Du den Rest am Besten per Suchmaschine. Normalerweise landet man bei Stackoverflow.

Wenn Du so ein Programm zusammen gezimmert hast drehst Du die Daumenschrauben an: kompilieren mit -Wall -Werror

Wenn Du die Probleme alle gelöst hast drehst Du die Schrauben weiter an: -Weverything

Versuche alles was da kommt zu verstehen. Vieles sind nicht Probleme die Du lösen musst.

Als nächstes nimmst Du einen Static analyzer. In den FreeBSD Ports liefert lang/clang36 einen mit: scan-build36 make

Fehler werden in interaktiven HTML-Dateien in denen man sich durch die Analyse klicken kann abgelegt. Behebe alle Fehler. Wenn der Analyzer einen Fehler findet, der keiner ist, mache Dir Gedanken wieso das dem Analyzer nicht klar ist. In der Regel handelt es sich um eine Annahme, die Du im aufrufende Code sicherstellst oder um Wissen über Datenstrukturen dass der Analyzer nicht hat.

Da solltest Du dann ein assert() in den Code einpflegen.

Ein Buch schlägst Du auf diesem Weg nicht auf.

Und dann ist da noch Valgrind.
 
Ein Buch schlägst Du auf diesem Weg nicht auf.
Das trifft alles zu was du schreibst, aber das eine zu tun heißt ja nicht notwendigerweise das andere zu lassen. Das hängt sehr von der individuellen Art zu lernen ab. Manche Leute können mit Bücher und Beispielen etwas anfangen, für andere ist das nichts. Man sollte sich m.E. nur nicht zu sehr verzetteln und Schritt für Schritt vorgehen.
 
@Athaba meinst du nur das bei reddit: Online Lua 5.1 source code browser
Kenn mich damit nicht aus.

Mit ein wenig Basis-Wissen und der Hilfe von Leo sollte das gehen.
Hört sich ja nicht so schlimm an als ich mir vorgestellt habe :)
Danke!

Faustregel: Wenn der Code eurer Meinung zwar nahezu perfekt ist und all die coolen Tricks, Patterns, Guidelines, etc. verwendet, er aber von einem dritten nicht einfach zu lesen ist, dann läuft was ziemlich falsch.
Ich denke auch generell, wo auch überall zu lesen ist, der Code sollte auch für andere leserlich sein. Ist irgendwie der Anfang aller Bücher. :)

Versuche alles was da kommt zu verstehen. Vieles sind nicht Probleme die Du lösen musst.
Das hört sich nach Kamikaze an ;)

Ich muss auch mal zu Valgrind ;) ^^

Man sollte sich m.E. nur nicht zu sehr verzetteln und Schritt für Schritt vorgehen.
Ich kann mit Büchern, aber ich kann mit den Beispielen und Übungen nicht. Also lesen ist und sollte auch kein Problem sein, nur die Beispiele richtig zu verstehen ist das Problem dabei und dann noch Übungen, die man auch nicht so einfach aus der Luft greifen kann.
Vielleicht gibts bei den Büchern irgendwie eine unterschwellige Hilfe, ich konnte leider nichts zwischen den Zeilen lesen.

So wie ich das mitgekriegt habe, ist die beste Möglichkeit C zu lernen - zu studieren und dann im Job weiter zu lernen.
Oder man hat einen Dozenten, der dir ständig hilft. Was ja unrealistisch ist.
Einfach mit einem Buch oder hier mal was da mal was "aufzuschnappen" wie Kamikaze ist richtig schwierig.
 
@Athaba meinst du nur das bei reddit: Online Lua 5.1 source code browser
Kenn mich damit nicht aus.
Nein, nicht nur das.

Code lesen hat was ähnliches, wie sein erstes Projekt machen. Es hilft dabei Dinge zu verstehen. Du hast ein Ziel, entweder dein Programm zum Laufen zu bekommen oder den Code zu verstehen. Das ist der Punkt, wo die Dinge zusammenkommen. Wenn du wo anstehst ein Ziel zu erreichen ist das perfekt zum lernen. Du weißt dann nämlich genau wo du hin willst, du kennst das Problem, das du mit deinem Programm lösen willst. Von da weg lernen ist extrem gut.

Beim Programmieren dann kommen eben viele Sachen zusammen. Du hast da die Syntax und das eher theoretische Wissen, dann das Wissen über deinen Editor, deine IDE, ansonsten noch über dein System, also wie Files funktionieren, wie Netzwerk, wie die Konsole funktioniert und verbindest das dann meist mit einer Library, was zu einem Konstrukt führt, wie "Ich benutze den vim, um mit C und der stdio library da 'Hello World' in mein Terminal zu schreiben". Es kann sein, dass du dich nicht gut genug mit deinem System, mit C, mit stdio, mit dem Terminal auskennst. Das fehlende Wissen kann man sich dann über ein Buch, einen Artikel, Stackoverflow, man pages, Code lesen, etc. besorgen.

Das nächste sind dann Bugs wo man Fehler macht. Da ist vor allem das war Kamikaze geschrieben hat extrem wichtig, weil du wirst Bugs produzieren, jede Menge. Das kannst du als gegeben annehmen und dann ist es wichtig, dass man sich mit den Tools, Warnings und Errors auskennt, Debugger, etc. beherrscht. Aber es geht da nicht nur direkt um die einzelnen Bugs, sondern auch, dass dein Verständnis um die Sprache und das Drumherum vertieft wird. Wenn was nicht so rund läuft hat man große Chancen auf viele Aha-Erlebnisse und man lernt effektiv und gerade am Anfang viel mehr als nur das, wie man den Bug findet, einfach weil man viel von dem sieht, was so passiert.

Und dann gibt es noch die "Daumenschrauben". Die sind genau dazu da das in Zukunft zu vermeiden, aber sie helfen nur wirklich wenn du weißt warum das Warning dasteht und man es nicht einfach ignoriert. Noch mehr Aha und immer Step by Step besserer Code. Das ist das was ich meinte, dass man mal draufkommt, was jetzt am ersten Buch, wo man mal so grundsätzlich die Syntax lernt blöd, falsch, gefährlich ist. Das erste Programmierbuch ist meines Erachtens eher um zu wissen um was es geht. Da gibt es Variablen, Datentypen, Funktionen, Kontrollstrukturen, Operatoren, etc. Aber um damit dann zu fahren und sich weiterzuentwickeln sind Bücher einfach zu passiv. Man kann halt nicht erwarten dass alles abgedeckt ist. Immer wenn es darum geht was zu erlernen, wo man effektiv was neues erzeugt, darauf aufbaut und sich ständig entwickelt kann schwer alles abgedeckt sein.

Man schreibt eben den selben Code mit dem die Sprache selbst oder das Betriebssystem, so wie die ganzen Tools geschrieben sind. Die Möglichkeiten sind grenzenlos, aber ein Buch eben begrenzt und deckt im besten Fall einen Bereich komplett ab.

Wenn Beispiele Probleme bereiten, dann einfach mal dort ansetzen wo man was nicht mehr verstanden hat und damit herumexperimentieren, ein paar Dinge ändern und schauen ob das rauskommt, was man erwartet. Wenn nicht, dann ist das eine große Chance plötzlich ganz viele Dinge zu verstehen, die vielleicht im Buch noch nicht mal angesprochen werden. Klappt das nicht kann auch ignorieren und weiter lesen etwas bringen. Dann lernt man das eben im zweiten Durchgang und denkt sich dann womöglich "Ah, das weiß ich eh schon".
 
Ich lese gerade, dass viele Leute eher raten, C++ zu lernen, als C...
gibt es da irgendwelche pro/Contra Argumente oder ist das persönliche Präferenz?
 
Ich lese gerade, dass viele Leute eher raten, C++ zu lernen, als C...
gibt es da irgendwelche pro/Contra Argumente oder ist das persönliche Präferenz?

Hat beides Vor- und Nachteile. Ich präferiere C++ deutlich und würde das auch allen Menschen empfehlen, außer sie wollen Kernel oder Embedded programmieren. Aber andere Leute werden dir da anderes sagen.

Ansonsten kann ich auch nur sagen, WTF reden hier allen in letzter Zeit so oft von Büchern. Ziel setzen, los legen und suchen wenn es nicht weiter geht. Dann lernt man genau die Dinge die man braucht und kann es sich auch besser merken. War bei mir zumindest immer so.

Und ich kann sehr dazu raten direkt mit einem modernen Dialekt anzufangen wie C++11 oder C11. Das spart einem sinnlose Mühe am Anfang (später wird man dann auch lernen den alten Code zu lesen und zu schreiben).
 
Ich würde erstmal für mich ein paar Grundlagen lernen und dann möglichst früh anfangen bei anderen Projekten mitzuwirken und den eigenen Code dann auch öffentlich zugänglich machen. Dadurch bekommt man viel Kritik, lernt aber auch viel!
 
Hat beides Vor- und Nachteile. Ich präferiere C++ deutlich und würde das auch allen Menschen empfehlen, außer sie wollen Kernel oder Embedded programmieren. Aber andere Leute werden dir da anderes sagen.

Ansonsten kann ich auch nur sagen, WTF reden hier allen in letzter Zeit so oft von Büchern. Ziel setzen, los legen und suchen wenn es nicht weiter geht. Dann lernt man genau die Dinge die man braucht und kann es sich auch besser merken. War bei mir zumindest immer so.

Und ich kann sehr dazu raten direkt mit einem modernen Dialekt anzufangen wie C++11 oder C11. Das spart einem sinnlose Mühe am Anfang (später wird man dann auch lernen den alten Code zu lesen und zu schreiben).
aber man kann doch mit fehlenden / unvollständigen Grundlagen nicht einfach 'loslegen'?
Oder soll man im Internet nach Tutorial X (für das angestrebte Projekt) suchen?

Also... man kann ja nicht einfach drauf los Coden...
 
aber man kann doch mit fehlenden / unvollständigen Grundlagen nicht einfach 'loslegen'?
Doch, kann man. Es kann ja nichts passierren. Was schlimmeres als eine Fehlermeldung oder ein wild laufender Pointer der dir das Progtramm abschießt kann es ja nicht geben. Na ja, einen bug an dem du verzweifelst ...;)
Oder soll man im Internet nach Tutorial X (für das angestrebte Projekt) suchen?
Nöö. selber denken macht schlau. Wirst du auch kaum finden.
Also... man kann ja nicht einfach drauf los Coden...
Doch, kann man. Einfach ein main(argc, argv), die Argumente auswerten und dann weiter je nachdem was du willst...
 
aber man kann doch mit fehlenden / unvollständigen Grundlagen nicht einfach 'loslegen'?
Doch natürlich. Was willst Du denn mit den Grundlagen anfangen, wenn Du noch nie Code geschrieben hast? Das sind doch substanzlose Luftschlösser.

Oder soll man im Internet nach Tutorial X (für das angestrebte Projekt) suchen?

Also... man kann ja nicht einfach drauf los Coden...
IMHO ist das das Einzige was Du tun kannst.
 
Erstmal klein anfangen, ein Ziel setzen!

Die Feinheiten muss man auch noch nicht mal lernen, um ein funktionsfähiges Programm zu erhalten. Es ärgert natürlich alteingesessene Hacker sehr, wenn man keinen schönen Code produziert oder nicht sehr effizient arbeitet aber nun... Das ist deren Problem.
 
Im Klartext:

Ich suche mir ein Projekt (z.B. einen konsolenbasierten TaTaschenrechner) und code los.
Schritt für Schritt die notwendigen Informationen zusammentragen und wenn ich nicht weiter weiss, in Foren etc. fragen?
 
Vielleicht doch noch ein kleiner Tip: Im Falle eines Fehlers niemals mehr als eine Sache vor dem erneuten kompilieren und laufen lassen ändern. Schon bei 2-3 Änderungen komsmt du schnell ins schleudern was denn nun der Grund für den Fehler war.
 
Die Frage nach Büchern kommt mir immer so vor, als ob jemand sich wochenlang mit dem Einstellen der Ventile an seinem Automotor beschäftigt. Nur um nach dem Abnehmen des Ventildenkels festzustellen, dass es ein moderner Motor mit selbst einstellenden Ventilen ist. Ja, Bücher können helfen. Wie viel hängt von den eigenen Vorlieben in Sachen Lernstrategie ab. Aber letztendlich ist Programmieren speziell und Softwareentwicklung allgemein ein Handwerk, was sich in erster Linie aus praktischen Fähigkeiten und damit auch praktischer Anwendung definiert. Oder anders gesagt: Ich schließe mich meinen Vorredner an. Schreibt erstmal Software und lernt die Theorie nebenbei. Wenn man damit einigermaßen fit ist, ist noch immer Zeit für Best Practices, Algorithmik und so weiter.

Dazu gehört für mich aber nicht nur Code in den Editor zu tippen, stattdessen auch gleich das Arbeiten mit Tools zu erlernen. Den Compiler braucht man sowieso, aber dazu kommt der Debugger (meist gdb, entweder blank oder per Frontend), bei C und C++ ein Tool zur automatisierten Speicheranalyse (meist wird man wohl Valgrind nehmen) und inzwischen eventuell zusätzlich noch ein Address Sanitizer. Auch ganz wichtig der Umgang mit einem Versionsverwaltungsystem wie beispielsweise git. Rubricanis Tip lässt sich dort 1:1 in "Commit early, commit often" übersetzen. Ich würde das alles für den Anfang in Form einzelner Tools empfehlen, allein schon um das Zusammenspiel zu begreifen. Aber man kann natürlich auch sofort auf IDEs setzen.
 
Und für alle die sich Fragen und was genau soll ich nun programmieren kann ich immer wieder https://projecteuler.net/ empfehlen. Das sind schöne kleine Aufgaben welche man nutzen kann um sich zumindest mit seiner Umgebung vertraut zu machen bevor man direkt eine Weltverbesserer-App schreibt ;)
 
Ich habe, glaube ich, alle Programmiersprachen in meiner Jugend ohne Bücher gelernt. Den Code, den ich am Anfang produziert habe, war nicht hübsch anzusehen, aber ich kann guten Gewissens sagen, dass er besser war als der "Industriestandard" (was ich da schon für Grütze gesehen habe, mein Gott!).

Bücher sollte man lesen, aber nicht unbedingt ausschließlich am Anfang. Programmieren lernen ist eine Wechselwirkung aus Fehler machen und Erfolg haben. Irgendwann macht man keine groben Fehler mehr und manchmal erreicht man den Punkt, wo man 200 Zeilen schreibt und der Code kompiliert auf Anhieb und läuft sogar fehlerfrei, obwohl das Geschriebene knifflig war.

Am besten "Learning by Doing"... Bücher sind initial ein Hinweis für Syntax-Lernen und dann muss es losgehen. Ich sehe das nämlich bei mir wenn ich jetzt Haskell lerne. Ich lese sehr viel, weil es schneller geht als sich hinzusetzen und zu programmieren. Aber da ich wenig Zeit habe, mich praktisch damit zu befassen, sind meine Fortschritte sehr schleppend langsam. Und sogar noch mehr... wenn ich tatsächlich dazu komme, etwas in Haskell dann zu programmieren, merke ich erst, dass ich was tatsächlich in einem Monat dazugelernt habe (erst dann spüre ich den echten Erfolg, vorher nicht!). Das führt dazu, dass man meint, man muss nochmal dies und das lesen, obwohl man längst das alles kann und mit ein paar Programmierübungen festigen könnte.

Kurz und knapp: Bücher sind bedingt nützlich. Praxis ist Gold wert.
 
Zurück
Oben