Beste Möglichkeit C zu lernen

Wenn ich mir anschaue was Leute im Python Forum ohne Buch/Tutorial verursachen, kann ich dem nur widersprechen. Und gerade bei C wo das Standardwerk vielleicht 200s in A5 misst, kann man nicht wirklich von Zeitverschwendung sprechen.
 
Andererseits, habe ich niemals im Leben auch nur 1 Buch für C gelesen und programmiere C, fließend und ordentlich. Das meiste habe ich beim Abgucken von anderen Projekten dazu gelernt. Natürlich habe ich Datenstrukturen und Algorithmen noch separat (ohne Bezug zu einer Programmiersprache) gelernt. Das halte ich für viel wichtiger als den C-Standard zu kennen.
 
Solche Leute mag es wohl geben die ohne auskommen, die Mehrheit pfuscht ihr Code leider allzu schnell hin und wundert sich das dieser nach einer Woche bereits unwartbar ist und man lieber von neuem beginnt. Und Datenstrukturen in C, viel gibts da nicht, auch ist der Syntax überschaubar. Aber Bestpractise gibt der K&C viel her, mehr als in manchen größeren Projekten.
 
Wenn man wissen will wozu best. Sprachkonstrukte aufgenommen wurden, worin die Intentention des Präprozessors bestand oder wie man Unix-UI gestalten sollte oder allgemein wie klar und lesbar C-Code sein kann, dann sind die paar Seite Lesestoff sinnvoller als Code-Monster deren gewachsene Strukturen eher abschreckend sind, gerade wenn man versucht fremdes(unpassendes Design dem unterzuschieben.
 
Wahrscheinlich ist K&R gemeint. Es geht um das Buch der Erfinder von C.

Beim Teamwork geht es aber auch darum, zu akzeptieren, dass andere Leute und man selbst Fehler haben und Fehler machen. Das wichtigste ist nicht, dass Leute Fehler machen, sondern (schnell) lernen aus den Fehlern, die sie gemacht haben. Ich habe täglich Code vor der Nase, der schlecht ist und dann auch Leute, die meinen Code nach einiger Zeit verschlechtern, weil sie ihn nicht verstanden haben (zum Beispiel aus vorberechneten Formeln in Arrays in schnellen Grafikroutinen machen sie wieder Divisionen, obwohl die CPU keine Division kann und dann alles flackert, "aber wenigstens ist das eben verständlich"). Manchmal muss man halt etwas für sich selbst weinen, aber akzeptieren, dass Leute nicht so gut den Code und Gegebenheiten verstehen, den man selbst produziert und dann weiter machen mit der Arbeit.

Wie man Code formatiert (KNF ist fast wie K&R) steht zu Genüge in style(9). Das ist keine Wissenschaft, sondern einfach auswendig lernen. Die Regeln dort sind gut und jahrzehntelang bewährt. C hat so wenig sprachliche Konstrukte (minimalistisch), dass es da fast nichts zu lernen gibt. Das ist ja das beste an der Sprache. Kein Grammatik-Bloat, kurz und knapp mit einfachen, aber wirkungsvollen Konstrukten kommt man voran. Was zu lernen ist, der (geordnete) Umgang mit Speicher, die libc allgemein und wie APIs zu verstehen sind und wie man sie entwirft, dann ist man schon ein besserer Programmierer als der Durchschnittsdödel.
 
Statt dem guten, alten astyle würde ich aber eher clang-format empfehlen. Gerade bei C++ um Welten besser.
 
Der Unterschied ist, dass ältere Tools wie astyle oder das von mir lange verwendete uncrustify versuchen Konstrukte zu erkennen und entsprechend einzurücken. clang-format zerlegt den Code in eine Art Baum, setzt ihn anschließend komplett neu zusammen. Es kommt daher in einigen Situationen (z.B. Funktionen mit komplexen Parameter, Lambdas) besser klar.
 
Gibt's das auch für Windows? Ich nutze astyle momentan vor allem für ein größeres VC++-Projekt.
 
Ja, es ist im Windows-Clang enthalten. Aber der Windows-Port ist noch ein recht "flüssiges" Ziel. Also keine Ahnung, in wie weit das funktioniert.
 
Kurze Zwischen-Frage:
Ist es eine gute Methode/Idee auch Code abzuschreiben oder bringt das so gar nichts?
Danke und Gruß
 
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!

DU bist der Maßstab. Wir wissen weder, wie du am besten lernst, noch warum du C lernen willst - ja, das ist durchaus nicht egal - und was für dich "weiterführend" ist.

Auf dieser dürren Grundlage Folgendes:

Mit K&R anfangen. Auflage recht egal. Werkzeug kennenlernen (VisualIrgendwas vs. vim/gcc, etc.), Infrastruktur kennenlernen (z.B. Präprozessor, makefiles (oder Besseres), etc.)

Nochmal: Mit K&R anfangen. Keine Kompliziertheiten. Kein C99. Kein Misra. Schlichtes, simples, altmodisches C.
Denn genau das ist C, simpel. Theoretisch. Im Sinne von "in 20 Seiten locker darstellbar". Kompliziert wird es, weil du kein Schutznetz hast, weil es Seiteneffekte gibt, weil du mit 1 falschen Symbol/Zeichen einen Amoklauf des Systems auslösen kannst, weil du alles aus kleinen Einheiten zusammensetzen musst, usw.

Nächster Schritt: Über alles ausführlich nachdenken. Ruhig auch doofe Kästchen malen ("da drin ist der Zeiger und dort ist das, worauf er zeigt").
Dann weiter nachdenken. Über alle möglichen Details. ("Woher kommt eigentlich Speicher?", "Was, wenn dieser Code in einem Thread unter vielen liefe?", "Wieso 'for' statt 'while' und welches wann und warum?", etc.).

Ultrasimple Bröckchen fabrizieren und ab in den Debugger und dann Schritt für Schritt durchlaufen. Ich habe mal C unterrichtet und der vermutlich wesentlichste Aha Moment waren praktisch immer Debugger Sessions.

Wenn du das drauf hast, richtig solide drauf, dann C99.

Kurz noch zu deiner Frage
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?

Du kannst C++ im wesentlichen als "C plus Objektorientierung" betrachten. Womit auch schon die Frage beantwortet ist. Nämlich: Wenn du gleich mit C++ anfängst, wirst du eine erheblich steilere Lernkurve haben. Wenn du aber erst mal C richtig solide lernst - und übst, übst, übst - dann wirst du C++ relativ leicht lernen.

Welches ist zu bevorzugen? Das hängt von dir und dem, was du vorhast ab. Vermutlich C++, einfach weil damit praktisch alles geht, was mit C geht, plus noch einiges dazu (und etwas fetter, was aber ausser bei kernels oder Treibern fast immer zu vernachlässigen ist).

Eine vielleicht nicht ganz unwichtige Randbemerkung: Es gibt trotz zahlreicher Versuche nach wie vor keinen besseren meta-Assembler als C. Und fast jede halbwegs ernstzunehmende Sprache bietet eine mehr oder weniger komfortable (und brauchbare) Schnittstelle zu C an (aber nicht zu C++).

Und: Diejenigen hier, die dir raten zu üben und *guten* Code von Profis anzusehen, haben recht. Allerdings solltest du vorher schon halbwegs gute Kenntnisse haben, sonst wird es zur mühsamen Qual und du lernst nicht viel dabei (weil du elegante Lösungen nicht erkennst).

Eine Warnung noch: Mach nicht den Fehler, den ich selbst gemacht habe und den viele andere auch machen, nämlich "cool" programmieren zu wollen. Praktisch nirgendwo ist gutes Kommentieren so wichtig wie in C. Und die (für Anfänger) beeindruckenden Tricks, ganz viel in eine Zeile zu packen sind ... völlig sinnlos. Der Compiler macht es im Zweifel bei 99,5% der Programmierer eh optimaler als die es könnten. Nur dass solcher "cooler" Code nach ein paar Monaten kaum noch (leicht) zu verstehen ist. Bedenke: Der allermeiste Code wird *weitaus* mehr gelesen als geschrieben.
 
Kurze Zwischen-Frage:
Ist es eine gute Methode/Idee auch Code abzuschreiben oder bringt das so gar nichts?
Danke und Gruß

Abschreiben direkt nicht, es sei denn man versteht einen Teil nicht und möchte sich an diesem nicht festbeißen und das eigene Projekt deswegen beerdigen. Allgemein sollte man den Code stets verstehen und evtl ähnlich/besser schreiben.


Ich formatiere Code in vim mit "=" (und zwar punktuell, da wo ich gerade dran bin; ich habe es an style(9) angepasst) und automatische Code-Formatierungswerkzeuge sind mir ein Graus. Sie machen meistens "blame" kaputt. Und man formatiert nicht fremden Code. Das macht nur Krieg im Haus (Code ist so wie eine Handschrift, man sagt nicht den anderen wie sie aussehen soll).
 
Ich formatiere Code in vim mit "=" (und zwar punktuell, da wo ich gerade dran bin; ich habe es an style(9) angepasst) und automatische Code-Formatierungswerkzeuge sind mir ein Graus. Sie machen meistens "blame" kaputt. Und man formatiert nicht fremden Code. Das macht nur Krieg im Haus (Code ist so wie eine Handschrift, man sagt nicht den anderen wie sie aussehen soll).

Kommt drauf an, ich kann Kritik an meiner Handschrift gut nachvollziehen da ich sie idr. selber nicht lesen kann ;)
 
Kurze Zwischen-Frage:
Ist es eine gute Methode/Idee auch Code abzuschreiben oder bringt das so gar nichts?
Danke und Gruß
Das kann man natürlich machen aber ideal wird es, wenn du dann noch nachvollziehst was du da abgeschrieben hast! Oft genug muss man die Code Schnippsel, die man so findet ohnehin anpassen...
 
Du kannst C++ im wesentlichen als "C plus Objektorientierung" betrachten.
Kannst Du definitiv nicht. Das war mal ursprünglich so als noch "C with Classes" hieß. Es war auch nie als objektorientierte Sprache gedacht, sondern es ging darum ein Abstraktionsfeature (Klassen) in C rein zu pfriemeln.

Als dann Templates eingeführt wurden wurde Generic Programming möglich, die Möglichkeit Algorithmen und Datenstrukturen voneinander zu abstrahieren. Eher zufällig sind Templates eine turingvollständige funktionale Programmiersprache mit der man direkt im Compiler Code erzeugen kann. Mit C++11 kam constexpr dazu, womit man zur Compile-Zeit mit beliebigen, sogar selbst definierten, Typen arbeiten kann (constexpr geht auch für Konstruktoren, und static member). Vorher konnte man nur Integer-Arithmetik in Templates machen.

Wichtiger aber als Templates (die sind eher ein Advanced-Feature) ist RAII, ein Idiom für Speicherverwaltung bei dessen Anwendung keine Memory-Leaks auftreten können. Selbst in Verbindung mit Exceptions, das Schicke, RAII funktioniert auch mit anderen Ressourcen wie File Handles oder Locks. Das ist in C nicht so umsetzbar, weil es Destruktoren voraussetzt und ohne Templates relativ nervig umzusetzen wäre.

...
Eine vielleicht nicht ganz unwichtige Randbemerkung: Es gibt trotz zahlreicher Versuche nach wie vor keinen besseren meta-Assembler als C. Und fast jede halbwegs ernstzunehmende Sprache bietet eine mehr oder weniger komfortable (und brauchbare) Schnittstelle zu C an (aber nicht zu C++).
Das liegt natürlich daran, dass Du mit C++ direkt an C andocken kannst und Du kannst direkt in C++ C-kompatible Schnittstellen definieren. Will heißen jede Sprache bietet Schnittstellen zu C während C++ keine Schnittstelle braucht, weil die Compiler schlicht C sprechen können.
 
Kamikaze,

Mit Verlaub aber hier geht's doch nicht um Fachsimpelei und auch nicht um "mein C++ ist besser als ..." sondern darum, einem Anfänger (zumindest in brace Sprachen) für ihn verständliche Informationen zu geben. Aber wenn du möchtest, können wir meine (zugegeben stark vereinfachte) Beschreibung gerne ergänzen um "und Templates und eine ganze Menge anderes fragwürdiges oder zumindest fragwürdig implementiertes Zeug".

Auch war meine C Schnittstellenanmerkung keineswegs gegen C gerichtet. Ich habe einfach einen nicht ganz unwichtigen Sachverhalt festgestellt. Und es ist nunmal so, dass andere Sprachen keine halbwegs brauchbare und bequeme Schnittstelle zu C++, Modula-2, Scala, usw, usf anbieten sondern eine für C.

Aber wenn du schon die wunderbaren Neuerungen für C++ ansprichst, dann sag auch dazu, dass es immer noch keine ordentliche Modul/Header Lösung gibt sondern man immer noch aufgrund der C Ursprünge einen unhandlichen, (Compiler) Performance ausbremsenden und notdürftig mit allerlei Gewurstel (z.B. precomplied headers) verschlimmbesserten Wust hat. Da gibt es Sprachen, die das schon seit 25 Jahren, 30 Jahren weitaus besser gelöst haben.
 
Mir geht es darum das C++ keine objektorientierte Sprache ist, nie gewesen ist, nie sein wollte. Und zweitens das C++ auch nicht einfach aufgebohrtes C ist.
 
Mit C++ kann man wunderbar objektorientiert programmieren. Was ist das Problem, Kamikaze? Es ist klar, dass die Sprache mehrere Paradigmen unterstützt, aber zu sagen, dass es keine objektorierte Programmierung unterstützt ist, denke ich, etwas übertrieben.
 
@EgoMania Och, einfach mal bei Open- oder FreeBSD in den Code reingucken - sinnvollerweise mit was einfachem, also z. B. der Implementierung von cat anfangen (Link für OpenBSD und FreeBSD). Baue es einfach Schritt für Schritt nach und gucke, was passiert (also nicht per Copy&Paste...). Versuche zu verstehen, was welche Code-Zeile bewirkt, und schon steckst Du mitten drin. Für den Pointer-Kram und Speicherverwaltung fand ich es allerdings hilfreich, noch mal einen Abstecher zu Assembler zu machen - das hilft, wenn man später mal eine doppelte Dereferenzierung auflösen muss und sich das dann schön bildlich vorstellen kann.
 
Hallo,

Ich hatte mal Pascal von Borland. Das hatte eine Deutsche Hilfe dabei. Da konnte ich in der Hilfe Befehle anklicken und viellesen.

FreePascal hat das auch, zwar in Englisch, aber trotzdem ähnlich. Leider ist es sehr schwierig den richtigen Pfad bei der Installation der Hilfe zu treffen. Ich versuche esalle Jahre wieder.

Bei C finde ich keinen der mir erklärt wie ich den Befehl finde. Ich versuche schon 30 Jahre zu programmieren, aber scheitere immer an Kleinigkeiten. Auf einem Taschenrechner lernte ich etwas BASIC und auf dem Atari 800XL. Mit Dem PC hatte ich etwas Hangman in Pascal geschrieben.
Aber bei C weiß ich nicht ob der Befehl mich indet oder ich ihn finden muß.
Angenommen ich will den 4 Buchstaben rot schreiben und den 7. blau. Dann muß ich in der Header-Datei das Wort Color suchen?? Um dann vermutlich '#include stdio' zu laden?? Wie man da vorgeht hat mir noch nie einer erklärt - wie finde ich den passenden Befehl?? Immer nur Bücher lesen. Ich werde Bücher lesen, aber um dann testen zu können muß ich den Leitfaden für alle Befehle wissen.

Ich habe so oft versucht anzufangen, aber jedes mal wußte ich nicht wie den Befehl finden. Es gibt so viele IDEs die auch frei sind, aber was nutzen die mir, wenn ich den Leitfaden für alle Befehle nicht kenne. Ich würde gern Solitair programmieren oder wollte Hangman schreiben. Aber jedesmalimmer das gleiche - wie gehts weiter?

mfg
 
Zurück
Oben