C vor C++ ?
-
Abend Leute,
ich weiß, dass Euch das Thema vermutlich nervt und ich will hier keinen Flamewar hervor rufen, sondern einfach nur ein paar Argumente hören bzw. lesen.
Thema : " Soll man C vor C++ lernen ? Ja oder nein ?". Lese zur Zeit immer wieder, dass man das tun sollte. Hauptgrund ist wohl, dass C++ auf C basiert(basieren soll) und somit es nur logisch ist, C vor C++ zu lernen.
Bin da bisschen anderer Meinung, da man wenn man C++ lernt auch so ziemlich alles kann, was man in C lernen würde, wobei C wohl etwas low-levler ist als C++.Und nun : Eure Meinung, bitte.
-
und ich will hier keinen Flamewar hervor rufen

Aha...
-
Ist ja nicht so, dass dieses Thema noch nie diskutiert wurde. Meine Meinung aus einem früheren Thread:
Nexus schrieb:
Du solltest aber einen Punkt nicht unterschätzen: Wenn man von C kommt, hat man für viele Anwendungsbereiche bereits Sprachmittel und spezifische Vorgehensweisen (eben diese Dinge wie
char*,malloc(),memcpy()). Wenn man in C++ ein Problem lösen will, kann man das auch mit C-Mitteln tun. Die Verlockung ist oft gross, bereits bekannte Ansätze zu verwenden. Beginnt man hingegen mit C++, stellt sich einem diese Frage gar nicht. Wenn man keine C++-Lösungsmöglichkeit für ein Problem kennt, kennt man gar keine. Dadurch ist man gezwungen, sich direkt über C++ zu informieren.Wenn man C++ lernen will, sehe ich keinen Grund, zuerst mit C anzufangen.
-
Nexus schrieb:
Ist ja nicht so, dass dieses Thema noch nie diskutiert wurde. Meine Meinung aus einem früheren Thread:
Nexus schrieb:
Du solltest aber einen Punkt nicht unterschätzen: Wenn man von C kommt, hat man für viele Anwendungsbereiche bereits Sprachmittel und spezifische Vorgehensweisen (eben diese Dinge wie
char*,malloc(),memcpy()). Wenn man in C++ ein Problem lösen will, kann man das auch mit C-Mitteln tun. Die Verlockung ist oft gross, bereits bekannte Ansätze zu verwenden. Beginnt man hingegen mit C++, stellt sich einem diese Frage gar nicht. Wenn man keine C++-Lösungsmöglichkeit für ein Problem kennt, kennt man gar keine. Dadurch ist man gezwungen, sich direkt über C++ zu informieren.Hmpf sorry, hatte mehrmals nach gewissen Stichwörtern gesucht.
-
Felixxx schrieb:
ich weiß, dass Euch das Thema vermutlich nervt
Jepp. ... aber ich habe erst heute darüber etwas gelesen, was man hier zitieren kann: Programming, Chapter 0 (siehe 0.2.1)
"C first": This approach to learning C++ is wasteful of students’ time and leads to poor programming practices by forcing students to approach problems with fewer facilities, techniques, and libraries than necessary. C++ provides stronger type checking than C, a standard library with better support for novices, and exceptions for error handling.
Wenn Du C programmieren willst, lerne C. Wenn Du C++ programmieren willst, lerne C++. Ganz einfach.
-
Ich schließe mich dem von krümelkacker zitierten Statement an und pflichte damit auch Nexus bei. C ist nicht C++. Wenn du die Sprachen vermischst handelst du dir in der Regel mehr Ärger ein als notwendig. Und wie auch aus dem Zitat zu entnehmen ist, ist C++ programmieren wesentlich angenehmer. Aber Vorsicht, man kann sich auch mit C++ das Leben zur Hölle machen, teilweise sogar noch mehr wie in C.
-
Vielleicht ist es einfacher, zuerst mit einer komplett anderen Programmiersprache anzufangen (z.Bsp. Python oder Perl) und erst dann zu C++ zu wechseln.
Ich weiss es nicht, da ich mit C++ angefangen habe (nicht kapiert->andere Sprache->C->wieder C++).
-
Glaub ich eher weniger. Ich würde Java eine große Ähnlichkeit zu C++ attestieren, und wenn es um die Objektorientierung geht sicher auch C++ überlegen, aber der Umstieg auf C++ wird ziemlich schmerzhaft werden und erfordert sehr viel umdenken. Alleine der Umgang mit den Objekten funktioniert in Java ganz anders, dass fiese dabei ist, es ist nicht offensichtlich. Der beste Weg wird meiner Meinung nach sein, Schritt für Schritt sich die Sprachmittel anzueignen und versuchen damit Probleme zu lösen. Dann ist das lernen auch nicht mehr so kompliziert, weil man immer mehr die Hintergründe kennen lernt und damit die Zusammenhänge versteht, was dann bei komplexeren Fragestellungen hilft. Diese Erkenntnis würde mir bei einer andere Sprache komplett fehlen.
-
Java gehört nicht dazu, davon würde ich die Finger lassen.
-
Schwer zu sagen, wie es andersrum gewesen wäre: Ich selbst hab mit C angefangen, später ist C++ dazugekommen.
Grundsätzlich denke ich, dass das C Basiswissen eine gewisse Sicherheit gibt im Umgang mit den "herkömmlichen" Techniken wie Pointer, Arrays, C-Strings oder teilweise recht trickreichen APIs. Man weiß einfach besser, was "unter der Haube" abgeht und dass man bei Typen richtig aufpassen muss. Manchmal muss man auch einfach C-Code aus irgendwelchen Beispielen oder Bibliotheken in eigene Projekte einbinden.
Andererseits habe ich schon viel "C++"-Code gesehen von Leuten, die eben viele Jahre C-Denkweise drin haben. Sie benutzen dann zwar vielleicht
std::stringund vielleicht nochstd::vector, aber nicht die anderen Dinge, die C++ so mächtig machen wie z.B. Referenzen oder eine tiefere Klassenhierarchie. Die ganze OO-Denkweise ist dann eben sehr rudimentär. Nicht dass es anders falsch wäre, aber C++ erleichtert es einem enorm, bestimmte Programmierparadigmen elegant umzusetzen. Da tun sich Leute, die gleich mit einer objektorientierten Sprache anfangen, natürlich viel leichter.Ich selbst hab mir mit C++ zu Beginn schwer getan:
couthabe ich schon für eine Errungenschaft gehalten und den Code halt in eine einzige Klasse gepackt statt in eine .c Datei. Das war's dann zunächst. Die "Erkenntnis" kam erst später.Egal womit Du anfängst, versuche im Laufe der Zeit beide Sprachen zu lernen, aber sie strikter auseinander zu halten und die Unterschiede zu erkennen als dies manches "Kombinations"Lehrbuch tut. Es sind zwei Sprachen. C++ ist nicht nur eine Befehleserweiterung zu C. Wenn Du C schreibst, benutze kein
std::coutsondernprintf. Wenn Du C++ schreibst, benutzestd::vectorund keine Arrays (es sei denn, sie wären wirklich mal sinnvoller). Versuche, die "Idee" und den "Geist" der jeweiligen Sprache zu erfassen und in ihr zu denken.Ein interessanter Text zu einem ähnlichen Thema ist http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html .
Da geht es zwar um Java und man kann das nicht ganz vergleichen, aber die Essenz ist eben, dass es nicht schadet, auch den "harten Weg" zu kennen (in unserem Fall C).
-
Der Beste Weg
, Programmierung zu erlernen, ist wahrscheinlich sehr individuell. Ich kann von meinen Erfahrungen erzählen, aber inwieweit es dir genauso erginge, wenn du den selben Weg nähmst, kann ich nicht beurteilen.Ich habe seinerzeit C vor C++ gelernt, und ich kann diesen Weg nicht empfehlen. Es hat lange gedauert, bis ich vernünftig C++ schreiben konnte -- vor allem deshalb, weil das Vorwissen in C mich glauben ließ, ich wüsste mehr, als ich tatsächlich wusste. Es ist leicht, in die "C++ ist nur eine C-Erweiterung"s-Falle zu tappen und seine eigene Lernresistenz auf diese Art künstlich zu erhöhen. Jetzt ist diese Problematik nicht spezifisch zwischen C und C++ - beispielsweise schreiben Leute, die von Java herkommen und Reflection gewohnt sind, in C++ gerne furchtbare dynamic_cast-Ungeheuer - aber sie ist hier besonders stark ausgeprägt, weil nahezu alles, was in C möglich ist, auch in C++ möglich, dort aber oft eine ausgesprochen dämliche Idee ist.
Womöglich wäre es sinnvoll (an Meinungen hierzu bin ich sehr interessiert), die Sprachen auf der Lernliste weiter zu streuen. Ich denke dabei daran, mit Sprachen anzufangen, die eher akademischer als praktischer Natur sind - beispielsweise Scheme oder Smalltalk. Diese lehren nützliche Denkmuster, erlauben (vergleichsweise) wenig dreckige Hackerei, und sie sind weit genug von Produktionssprachen entfernt, dass schlechte Angewohnheiten sich nur mühsam übertragen lassen sollten.
In jedem Fall sollte man keine zu hohen Erwartungen haben. Es gibt keine Sprache X, für die man sagen kann: "Wenn du Sprache X einmal erlernt hast und dann zu C++ wechselst, hast du C++ in zwei Wochen gemeistert." Nicht für X ≠ C++.
-
seldon schrieb:
...Jetzt ist diese Problematik nicht spezifisch zwischen C und C++ ...
Das kann ich bestätigen - mir fällt es z.B. schwer, nicht in die "C++ in Java programmieren"-Denke zu verfallen, weil ich in C++ relativ sattelfest bin, aber ab&an Java schreibe.
Ich muss mir immer wieder sagen "Das sind 'different animals'!" und "Vergiß, wie du es in C++ lösen würdest und lerne (!!!), wie man es in Java löst!".
Ist aber nicht leicht.Gruß,
Simon2.
-
Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?
-
knivil schrieb:
Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?
- Garbagecollector
- Mehrfachvererbung
- ZeigerUm unterschiede zu nennen.
-
HighLigerBiMBam schrieb:
- Garbagecollector
Gibts zum Glück nicht. Dafür was viel besseres SmartPointer.

Macht aber vom programmieren her nicht den Unterschied.HighLigerBiMBam schrieb:
- Mehrfachvererbung
Wird im allgemeinen abgeraten von. Lässt sich aber auch in Java realisieren, ich denk da nur an
interface.HighLigerBiMBam schrieb:
- Zeiger
Die gibt es nun leider doch in Java und das ist auch die böse Falle, in die ein Java-Entwickler tappen wird, der plötzlich C++ programmieren will. Dabei wird ihm der fehlende GC erst mal weniger auf die Füße fallen. Es ergeben sich aber auch Überraschungen für den C++ Entwickler.
-
Nick Unbekannt schrieb:
...
Genau deshalb sind dies Unterschiede in der Implementierung.
-
Haben sich doch wohl ein paar zusammen gefunden, die Lust hatten was zu schreiben

Klingt auch alles sehr logisch und war so ziemlich das, was ich mir gedacht hatte nur detaillierter und zum Teil mit mehr Fachwissen.
Sehe ich das richtig, dass ein Unterschied zwischen Java und C++ auch darin besteht, dass man für C++ mehrer Programmierparadigmen anwenden kann und für Java außschließlich OO ?Und was macht C mehr zur low-level Sprache ? Z.B das Benutzen von C-Strings statt einer komplett entwickelten std::string Klasse ? Was noch ?
-
Felixxx schrieb:
Und was macht C mehr zur low-level Sprache ?
Ich behaupte jetzt einfach mal: Ihre Struktur. C gilt als ein "besseres Assembler", weil es prinzipiell das Gleiche macht, nur etwas schöner und abstrakter: Zugriff auf einzelne Speicherzellen, einfache Kontrollstrukturen wie konditionelle Entscheidungen und Schleifen (die im Prinzip auch nur eine Kombination aus Entscheidung und Sprung sind), simple Typen (die ihre Nähe zu einzelnen Speicherzellen nur schwer verbergen können: selbst beim C-String muss man immer daran denken, wie die Daten im Speicher liegen), einfache Arithmetik, meist auf Bit-Ebene.
C ist in etwa das Äquivalent zu einer mechanischen Maschine, und auch beim Einsatz in einem Microcontroller man kann eine gewisse Entscheidungslogik noch nachvollziehen: Wenn Knopf A gedrückt und Sensor B diese und jene Daten hat, dann mach Lampe C an und drehe Motor D.
Den High-Level-Sprachen würde ich dann die größere Intelligenz zuschreiben (nicht, dass man nicht das meiste auch in C machen könnte, nur vieles vermutlich schwieriger), so Sachen wie Bild- und Stimmenerkennung, Bewegung im Raum (Matrizen!), selbstlernende Roboter, Fuzzy-Logic, Wettersimulation usw. Da kann man besser mit komplexeren mathematischen Modellen arbeiten, die sich weit jenseits von if-then befinden und bei denen sich C (und sicher auch C++) recht schwer tut.
Wenn C die Addition von Teilflächen wäre, dann wäre eine high-level-Sprache das Integral. So mal ganz grob meine Einschätzung.
-
Nick Unbekannt schrieb:
Macht aber vom programmieren her nicht den Unterschied.
RAII und Garbage Collector sind ziemlich verschiedene Konzepte. Beispielsweise hat man mit dem GC keine deterministischen Destruktoren und muss Nicht-Speicher-Ressourcen manuell freigeben. Dazu kommt der Sprachunterschied bezüglich Objekt- und Referenzsemantik.
Nick Unbekannt schrieb:
Wird im allgemeinen abgeraten von. Lässt sich aber auch in Java realisieren, ich denk da nur an
interface.Von MI wird höchstens präventiv abgeraten, weil sie viele falsch einsetzen. Aber das trifft auf einfache Vererbung mindestens ebenso zu.
Java ermöglicht keine Mehrfachvererbung mit status- oder funktionalitätsbehafteten Klassen.
Felixxx schrieb:
Sehe ich das richtig, dass ein Unterschied zwischen Java und C++ auch darin besteht, dass man für C++ mehrer Programmierparadigmen anwenden kann und für Java außschließlich OO ?
C++ gewährt dem Programmierer generell mehr Freiheit. Für eine ausführlichere Gegenüberstellung siehe hier.
-
knivil schrieb:
Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?
Beispiele:
- Reflection
- value semantik
- RAIIAlso ich stolpere immer wieder einmal über die unterschiedliche "Denke": Während in Java unglaublich viel in die Laufzeit verlegt wird, versucht man in (gutem) C++ möglichst viel zur Compilezeit entschieden zu haben. Das merkt man z.B. daran, dass explizites Casting in Java ganz normales Alltagsgeschäft ist ("Na dann fliegt halt eine bad-cast-exception"), während in C++ alle Alarmglocken schellen, wenn man mal explizit casten muss.
Wenn man (z.B. hier im Forum) mal schaut, was die typischen Fragen von "Komme-von-Java"-C++-Neueinsteigern ist, drehen sich 90% darum, dass sie
a) Reflection (bzw. allg. "Typbestimmung zur Laufzeit") gewohnt sind und das in C++ vermissen und/oder
b) mit der value semantik ("auto Objekte" im Gegensatz zu solchen, auf die mit Pointern/Referenzen verwiesen wird).Des Weiteren habe ich den Eindruck, dass in der Javawelt der Fokus viel stärker auf dem einen Weg liegt. Da wird sehr stark auf Vorhandenem aufgebaut - überspitzt gesagt: Ein Javaprogramm ist nur ein Stückchen Konfiguration für eine Laufzeitumgebung, die dann die eigentliche Arbeit macht.
Vorteil: Mit überschaubarem Aufwand wird schnell was auf die Beine gestellt, was allgemein"verständlich" ist.In C++ wird viel stärker an sehr speziell zugeschnittenen Lösungen gearbeitet. Das drückt sich auch in der größeren Vielfalt der Programmiermittel (OO UND Funktionen, Laufzeit- UND Compielzeitpolymorphie, high- UND lowlevel-Programmierung, ...).
Überspitzt gesagt: Für jeden Weg das Rad neu erfunden.
Vorteil: Klarer definierte und besser passende Programme und universellere Konzepte.Wenn ich denn mal in die Javawelt eintauche, bin ich einerseits begeistert von all dem, was es schon gibt - andererseits verblüfft über die Vertrauensseligkeit.
Ein typischer Satz für einen C++-Programmierer: "Ich definiere meine Schnittstelle so, dass jeden Anwender sofort klar ist, was sie tut und er sie nur richtig verwenden kann." (und damit ist nicht der Funktionsname oder die Dokumentation gemeint)
Der Javaprogrammierer würde vllt. eher sagen: "Ich definiere meine Schnittstelle so, dass sie funktioniert und ich sie möglichst nicht mehr ändern muss."Gruß,
Simon2.