Bei C++ Grundlagenkenntnisse in C überflüssig?
-
Ich lese hier oft Fragen für C++ deren Beantwortung mit einfachen Grundlagenkenntnissen in C sehr leicht möglich wären. Ein Bespiel wäre Pointer bei einem Character-String und ähnliches für C banales.
Braucht man C nicht mehr und warum fragen Einsteiger in C++ so oft 'wie soll ich dies oder jenes machen?' Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

-
Wer C++ lernt (Einsteiger) wird irgendwann mal mit dem ganzen
Altlasten von C konfrontiert und stellt dann entsprechende Fragen.Braucht man C nicht mehr
Unabhängig davon, ob mans noch braucht (IMO nein, gibt ja C++)
oder nicht. Die Schnittmenge von C und C++ muss man sich eben
angucken, wenn man C++ lernt.
-
berniebutt schrieb:
... warum fragen Einsteiger in C++ so oft 'wie soll ich dies oder jenes machen?' Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

Wenn die Einsteiger "C++ vom A bis Z" lesen ist das doch kein Wunder

-
Einige Dinge, die bei C noch unter "Grundlagen" laufen, sind bei C++ eher "Details für Fortgeschrittene". Das heißt, es kann durchaus vorkommen, dass man schon eine Weile C++ lernt und mit der STL per Du ist, bevor man sich mit low-level Pointerfrickeleien und C-Strings auseinandersetzt, die in C zum täglich Brot gehören und einem in den ersten Monaten in Fleisch und Blut übergehen müssen. Ich behaupte von mir, in C++ schon recht fortgeschritten zu sein. Ich stoße aktuell aber in unserem C-Uralt-Code auf Dinge von damaligen C-Einsteigern, die für mich einfach schlicht gesagt Hirnfick sind. Ein Beispiel ist eine dreidimensionale Matrix aus void-Pointern, die zusammengebaut, kreuzverlötet und mit Funktionspointern verschiedenster Typen belegt wird. Wenn ich sowas sehe, hängt sich bei mir irgendwas aus. Für C-ler wirds was leichtes sein...
-
Ich als verkappter C-ler finde C++-"Profis" die nur wenig C können jedenfalls immer wieder lustig.

Aber deren Existenz beweist nun mal auch, dass man C für C++ nur unvollständig können muss.
-
berniebutt schrieb:
Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

Ein Anfänger ist doch aber gerade erst dabei sich in der "Denkweise von C++" zu üben...
-
Es sind nunmal zwei verschiedene Sprachen. Klar, C++ ist aus C hervorgegangen, aber das war vor 20 Jahren und seitem ist eine Menge passiert.
dot schrieb:
berniebutt schrieb:
Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

Ein Anfänger ist doch aber gerade erst dabei sich in der "Denkweise von C++" zu üben...
Selbst wenn er über das Stadium des Übens schon hinaus ist, sind Teile von C in der grundsätzlichen Denkweise von C++ nicht mehr wirklich enthalten*, auch wenn sie aus historischen und Kompatibilitäts-Gründen noch in der Sprache enthalten sind.
________________________
* Alte C/C++-Hasen aus vor-Standard-Zeiten mögen das anders sehen, ich schreibe aber extra "nicht mehr", weil sich das moderne C++ von dem der 90er Jahre dann doch deutlichst unterscheidet.
-
In C programmiert man halt anders. Ist ja auch ne andere Sprache.
-
Ich weiß nicht, aber ich find eigentlich überhaupt nicht, dass die die Konzepte und Denkweisen derer man sich beim Coden in C so bedient, in irgendeiner Form stark von denen, die man in C++ anwenden würde, unterscheiden. C++ bietet eben noch ein paar Paradigmen mehr, aber rein grundsätzlich find ich, dass man C, was das angeht, auf jeden Fall als Untermenge von C++ betrachten kann. Zumindest meinen bescheidenen Erfahrungen mit C nach...
-
dot schrieb:
Ich weiß nicht, aber ich find eigentlich überhaupt nicht, dass die die Konzepte und Denkweisen derer man sich beim Coden in C so bedient, in irgendeiner Form stark von denen, die man in C++ anwenden würde, unterscheiden. C++ bietet eben noch ein paar Paradigmen mehr, aber rein grundsätzlich find ich, dass man C, was das angeht, auf jeden Fall als Untermenge von C++ betrachten kann. Zumindest meinen bescheidenen Erfahrungen mit C nach...
Der Unterschied ist, dass sowas hier in der Regeln in C++ schön weggekapselt
wird.Ein Beispiel ist eine dreidimensionale Matrix aus void-Pointern, die zusammengebaut, kreuzverlötet und mit Funktionspointern verschiedenster Typen belegt wird.
Wenn man diesen Low-Level-Kram nicht gewöhnt ist, tut man sich halt deutlich
schwerer. Da braucht man dann schon nen Drei-Sterne-Programmierer für.Ich würd sagen, in puncto Wartbarkeit schlägt da idiomatisches C++ C eh um Längen. Mir geht es da wie pumuckl und das ist gar nicht so schlecht. Hält mich davon ab, so Monster überhaupt zu bauen.
-
dot schrieb:
Ich weiß nicht, aber ich find eigentlich überhaupt nicht, dass die die Konzepte und Denkweisen derer man sich beim Coden in C so bedient, in irgendeiner Form stark von denen, die man in C++ anwenden würde, unterscheiden. C++ bietet eben noch ein paar Paradigmen mehr, aber rein grundsätzlich find ich, dass man C, was das angeht, auf jeden Fall als Untermenge von C++ betrachten kann. Zumindest meinen bescheidenen Erfahrungen mit C nach...
Das Ding dabei ist, dass einige der C-Paradigmen in 98% der Fälle durch andere C++-Paradigmen ersetzt werden. Erst wenn man auf einen Fall für die restlichen 2% stößt, muss man sich mit dem C-Paradigma auseinandersetzen, das dann eben sehr ungewohnt daher kommt und die Frage hier im Forum triggert. Als Beispiel nenn ich mal Ellipse und die va_args Makro-Familie. In C wird man vielleicht hin und wieder damit konfrontriert, dass man eine variadische Funktion bastelt, in C++ eben nicht, weil sie nur für PODs benutzbar sind. Stattdessen greift man in C++ lieber auf irgendeine Art des Operator-Chainings oder ähnliches zurück.
-
Viele schöne Anworten auf eine etwas provokativ gestellte Frage.

Hatte ich mir gedacht: eine höhere Komplexität einer Programmiersprache bringt für Anfänger leider auch keinen leichteren Einstieg in die Programmierung. Ist in C++ alles schön weggekapselt, was man in C einst notwendig lernen, verstehen, und anwenden musste.Vielleicht hatten die 'Alten Säcke der Programmierung aus der Steinzeit' doch manches einfacher? Der Einstieg war zugegeben hart. Wenn man ihn geschafft hatte, war man aber weitgehend sicher und wusste besser was man überhaupt tut. Gab es etwas neues wie C++ hat man sich das angesehen und übernommen.
-
berniebutt schrieb:
Vielleicht hatten die 'Alten Säcke der Programmierung aus der Steinzeit' doch manches einfacher? Der Einstieg war zugegeben hart. Wenn man ihn geschafft hatte, war man aber weitgehend sicher und wusste besser was man überhaupt tut.
Einfacher? Nicht wirklich. Wie du schreibst war der Einstieg hart, weil man sich mit Low-Level-Details herumschlagen musste. Klar wusste man danach besser was man auf dem Level tat. Dafür waren Probleme auf höherem Level häufig nur schwer bis garnicht abstrahierbar, man musste für sowas also entweder das Rad jedesmal neu erfinden oder sich ein sehr abstraktes, dafür aber nur schwer lesbares und kaum wartbares void-Pointer-Frickel-Rad bauen.
Man überlege sich, was beispielsweise Templates zu leisten vermögen. Eine kleine Änderung, und der Compiler kann völlig anderen Code generieren. Dass dafür die Low-Level Fähigkeiten nicht so ausgeprägt sind, weil die einem in den meisten Fällen vom Compiler und/oder den Bibliotheken ersetzt werden, ist der Preis, den man dafür zahlt.
[quote]Gab es etwas neues wie C++ hat man sich das angesehen und übernommen./quote] Wers nur "angesehn und übernommen" hat, statt es sich als eigenständige Sprache von Grund auf neu anzueignen, der schreibt auch entsprechenden Code - C mit Beiwerk, ohne sich der wirklichen Stärken von C++ voll bewusst zu sein.
Es gibt verschiedene Sprachen für verschiedene Abstraktionslevel. Verschiedene Probleme benötigen entsprechend verschiedene Level, deshalb haben alle Sprachen ihre Daseinsberechtigung. C++ ist eine Sprache mit hohem Abstraktionslevel, die nativ auf eine Sprache mit niedrigerem Abstraktionslevel zurückgreifen kann.
Das ist sowohl eine Stärke der Sprache, weils eben alles in Einem bietet, aber auch eine Schwäche, weils die Wahl der Sprachmittel erschwert und grade bei Umsteigern zu einer wilden und unnötigen Mischung zwischen Low-level und High-level Code führt: (Oder erfahrungsgemäß Low-Level und Medium-Low-Level)
-
berniebutt schrieb:
Ist in C++ alles schön weggekapselt, was man in C einst notwendig lernen, verstehen, und anwenden musste.
Lustigerweise war das bei mir genau anders herum. Ich habe erst C und dann C++ gelernt, weil C++ mir anfangs zu kompliziert erschien. Das fing schon damit an, dass mich
cout << "Hallo, Welt!";tierisch aufgeregt hat, weil ich nie verstanden habe, was dieses komische << soll, warum das nur bei cout und cin auftaucht und wie man das sonst noch anwenden kann. Ich hatte irgendwie immer das Gefühl, etwas verpasst zu haben. Da mich die Funktionsweise von Computern und der ganze Low-Level Kram dann eh noch interessiert haben, habe ich halt mit C begonnen. Bereut habe ich das eigentlich nie, obwohl ich zugegebenermaßen mittlerweile C++ bevorzuge, wenn ich die Wahl habe.
-
cooky451 schrieb:
weil C++ mir anfangs zu kompliziert erschien.
Ist es nur, wenn man gleich von Anfang an mit allen Features auf einmal konfrontiert wird und ohne Struktur und roten Faden allein gelassen wird. Der Sprachumfang macht eine strukturierte Schritt-für-Schritt-Einführung notwendig, die nur wenige Bücher bieten.
Wenn man dich vor ein Gerät mit 50 verschiedenen Knöpfen stellt und nur sagt "mach mal" bist du auch verloren. Wenn man es dir erklärt und zu Beginn erstmal mit zwei oder drei Schaltern anfängt, weil man den Rest für die ersten Schritte noch nicht braucht, dann kann man das schrittweise erweitern.weil ich nie verstanden habe, was dieses komische << soll, warum das nur bei cout und cin auftaucht und wie man das sonst noch anwenden kann. Ich hatte irgendwie immer das Gefühl, etwas verpasst zu haben.
Das was du vermutlich verpasst hast war dann wohl das erste oder zweite Kapitel, in dem die wichtigsten Grundzüge von Ein/Ausgabeströmen in C++ erklärt wurden

-
pumuckl schrieb:
Das was du vermutlich verpasst hast war dann wohl das erste oder zweite Kapitel, in dem die wichtigsten Grundzüge von Ein/Ausgabeströmen in C++ erklärt wurden

Ich weiß es nicht mehr ganz genau (mein einziges C/C++ Buch (Ja, C/C++
) ist nicht so toll), allerdings hätte man mir vermutlich ganz am Anfang Operatorüberladungen erklären müssen.
Das ist aber wohl eine Eigenart von mir, ich hasse es einfach Dinge zu benutzen, die ich nicht zumindest im Ansatz durchblickt habe. Lustigerweise ist mir, soweit ich mich erinnern kann, die variable Parameterzahl von printf() erst so spät aufgefallen, dass ich dieses Mysterium nachschlagen konnte. Da hatte ich noch mal Glück, nachher hätte ich noch Pascal gelernt.
-
berniebutt schrieb:
Ein Bespiel wäre Pointer bei einem Character-String und ähnliches für C banales.
Deine Kenntnisse der C-Banalitäten haben interessanterweise dazu geführt, daß Du bei einem 200-Zeilen Programm 2 banale
Semikolons vergessen hattest. Der Source-Code war von Dir online gestellt verbunden mit dem Hinweis,daß das Programm nicht funktioniere (Algorithmus zum Berechnen von Schaltjahren war nach eigenen Angaben auch nicht richtig.) und konstruktive Kritik willkommen sei. Soviel mal zum Thema banale Fragen.berniebutt schrieb:
Braucht man C nicht mehr und warum fragen Einsteiger in C++ so oft 'wie soll ich dies oder jenes machen?' Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

Hm, da C++ und C gemeinsame Grundlagen haben, dürfte es unmöglich sein , C++ zu lernen, ohne auch C zu lernen.
Es gibt mit Sicherheit viele Sachen, wo C-Kenntnisse zu einem besseren Verständnis der Materie führen. So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
Geht man diesen Gedankengang weiter, könnte man auf die Idee kommen, warum eigentlich nicht erstmal Assembler lernen, bevor man C lernt. Das Verständnis z.B. eines Arrays ist mit Sicherheit besser, wenn man das erstmal in Assembler programmiert hat. Nicht zu vergessen die detaillierte Funktionsweise der Hardware.
Was also soll der Maßstab sein, um mit C oder C++ zu beginnen?
-
redrew99 schrieb:
So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren kann.
Das Argument hat mich vollends überzeugt.
-
redrew99 schrieb:
So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
vector ist ein Wrapper um einen dynamisch allozierten T[] und sonst nichts

-
Das stimmt natürlich, aber entscheidend in Bezug auf das Thema ist doch, daß man einen Container, der die Funktionalität eines Vektors besitzen soll, auch mit C programmieren könnte.
Hat man ja wohl früher auch, als es die STL noch nicht gab.