C notwendig für C++?



  • Imo hindert ein Wissen über C einen daran, guten C++-Code zu schreiben. Der wird dann eher - C.
    Dasselbe wie mit Wissen über Java, das wird dann auch Java in C++.



  • Das war nicht seine Erfindung...



  • Dann halt die ERfindung seines Vaters ^^ jetzt nörgel nicht über mein gesundes Halbwissen 🤡



  • Nathan schrieb:

    Imo hindert ein Wissen über C einen daran, guten C++-Code zu schreiben. Der wird dann eher - C.
    Dasselbe wie mit Wissen über Java, das wird dann auch Java in C++.

    Finde ich absolut nicht. Ohne C-Kenntnisse versteht man recht wenig von der Funktionsweise der Abstraktionen von C++ und naja - C++ bietet mehr als genug Stolperfallen.



  • Ich sehe das so, wie Stroustrup, Koenig und Moo (siehe Preface unter Sample Content)

    TL;DR:

    Wenn man an C++ interessiert ist, ist es ist eine blöde Idee, erst die "C-Untermenge" von C++ lernen zu wollen und danach den Rest. C++ bietet Dir nette High-Level-Bausteine in Form von Bibliotheks-Features, die man sofort benutzen kann, ohne dass man erst lernen und verstehen muss, wie man so etwas selbst bauen kann. Die Gefahr beim zuerst-C-Lernen ist die, dass man geneigt sein könnte, seinen C-Stil nach C++ zu importieren -- und das, obwohl dir C++ Mittel bietet, mit denen gewisse Dinge besser gelöst werden können. Wichtig ist jedenfalls, dass C++ nicht als C mit ein paar extra Features verstanden wird, sondern als eigene Sprache mit eigenen Mustern und Mitteln. C ist zwar quasi ein Teil von C++, aber das heißt nicht, dass man diesen Teil zu erst lernen muss.

    Also auch von mir der Tipp: Lerne C++ mit 'nem guten C++ Buch zur Hand.

    Ethon: Sprichst Du da aus Erfahrung? Hast Du C++ mit dem "modernen Lehransatz" vor C gelernt?



  • kkaw schrieb:

    Ethon: Sprichst Du da aus Erfahrung? Hast Du C++ mit dem "modernen Lehransatz" vor C gelernt?

    Ich hatte ein Buch das viel auf Abstraktionen wie zb. den STL-Containern aufgebaut hat, ja.
    Nur dumm dass ich primär an Systemprogrammierung interessiert war und mit den low level APIs dadurch teilweise durchaus zu kämpfen hatte.
    Nach einem Ausflug nach Assembler-Land war mir C und C++ total klar.
    Dummerweise habe ich mir dabei ein Lowlevel-Denken angewöhnt dass ich nicht mehr ablegen kann.



  • Nathan schrieb:

    Imo hindert ein Wissen über C einen daran, guten C++-Code zu schreiben.

    Aber C++ ist aus C entstanden, also gibt es kein gutes C++.



  • Ethon schrieb:

    Nathan schrieb:

    Imo hindert ein Wissen über C einen daran, guten C++-Code zu schreiben. Der wird dann eher - C.
    Dasselbe wie mit Wissen über Java, das wird dann auch Java in C++.

    Finde ich absolut nicht. Ohne C-Kenntnisse versteht man recht wenig von der Funktionsweise der Abstraktionen von C++ und naja - C++ bietet mehr als genug Stolperfallen.

    Der Meinung bin ich auch.

    Wie will man eine Liste verstehen, wenn man nicht einmal weiß, wie man es in C mit Zeigern realisieren würde?

    Jeder Programmierer sollte daher C können, an C geht kein Weg vorbei. Dies gilt auch dann, wenn man heute in anderen Sprachen programmiert.

    Etwas anders sieht es vielleicht bei funktionalen Sprachen wie Haskell aus, aber das ist ein komplett anderes Thema, so wie Äpfel und Birnen.
    Aber auf C baut fast alles gängige auf, C++, Java, C#, D und viele andere.



  • C sind Grundlagen schrieb:

    Wie will man eine Liste verstehen, wenn man nicht einmal weiß, wie man es in C mit Zeigern realisieren würde?

    Was hat das mit C zu tun? Das kann man in C++ genauso ohne C lernen zu müssen. C++ besitzt die Zeiger ja ebenso, dennoch muss man nicht C-APIs lernen um dieses Thema zu verstehen.

    C sind Grundlagen schrieb:

    Jeder Programmierer sollte daher C können, an C geht kein Weg vorbei. Dies gilt auch dann, wenn man heute in anderen Sprachen programmiert.

    Merkwürdig: Ich habe nie C gelernt und programmiere inzwischen etwa 15 Jahre beruflich (Vorwiegend übrigens mit C++). Das (sehr) wenige wirklich rein "C-spezifische" das ich brauche (und das auch nur wegen ein paar C-APIS die ich beruflich einsetzen musste), habe ich mir später angeeignet.

    C sind Grundlagen schrieb:

    Aber auf C baut fast alles gängige auf, C++, Java, C#, D und viele andere.

    Man braucht kein bisschen pures C um C++, Java und C# zu lernen, eher im Gegenteil wenn ich mir den Code anschaue, den manche die aus der C-Welt kamen in eben jenen Sprachen produziert haben (Das mag nicht zwangsweise an C gelegen haben, nur war die Schnittmenge schlecht wartbaren Codes bei diesen Programmierung wesentlich höher als in anderen Gruppen).

    Wer C++ lernen will, braucht nur ein gutes C++ Buch. Das was er von "C" braucht (sagen wir lieber: von der Schnittmenge die in C und C++ identisch sind), deckt ein solches Buch in der Regel auch ab. Beispielsweise Zeiger (wenn dies ggf. aber an einer anderen [späteren] Stelle als in einem C-Buch vorkommt).



  • asc schrieb:

    [...]

    👍



  • interessant. Falls das stimmen sollte, dann für asc und dich eine ...

    ... Aufgabe: Schreibe ein Programm, das "hello, world" ausgibt, und zwar 1) in C++ und 2) unter Verzicht auf alle Sprachelemente, die auch in C vorkommen. Müßte ja einfach sein, wenn man in C++ angeblich kein C braucht.

    "main" fällt schon mal weg (das wird dem Linker gar nicht gefallen), das Semikolon auch, geschweifte Klammern dito. #include und die spitzen Klammern natürlich auch.

    Da wird es aber ziemlich eng mit der Auswahl an Sprachelementen, würde ich meinen:

    iostream 
    
    std::cout <<         << std::endl
    

    Soviel zur immer wieder aufpoppenden Behauptung, man könnte in C++ programmieren, ohne C zu benutzen.



  • großbuchstaben schrieb:

    ... Aufgabe: Schreibe ein Programm, das "hello, world" ausgibt, und zwar 1) in C++ und 2) unter Verzicht auf alle Sprachelemente, die auch in C vorkommen. Müßte ja einfach sein, wenn man in C++ angeblich kein C braucht.

    Du bist auch aus deinem Vater und deiner Mutter hervorgegangen, heißt das du musst dich zwangsweise wie Selbige verhalten?

    C++ ist schon lange nicht mehr ein um Klassen aufgebohrtes C, sondern hat sich in eine eigenständige Sprache weiter entwickelt - die aber weitgehend (aber nicht komplett) zu C abwärtskompatibel ist. Eine Schnittmenge von Sprachelementen sagt nicht, das man beide Sprachen lernen muss, oder das eine Sprache eine andere ist.

    Man muss nicht separat C lernen um C++ zu können. Wenn ein Sprachelement in C++ wichtig ist, wird es auch in einem C++ Buch beschrieben, unabhängig ob es aus einer anderen Sprache übernommen wurde oder nicht. "Kindergarten" mag in Deutsch und Englisch existieren geschrieben werden, das heißt dennoch nicht das man beide Sprachen beherrschen muss.

    Ich kenne bis heute nur einen sehr kleinen Teil der C-API (ich nutze nur den Teil, für den bislang keine eigene C++ Bibliothek geschrieben wurden ist; würde ich C++11 nutzen können, bräuchte ich noch weit weniger als bislang). Auch bin ich z.B. mit malloc und free nur in einem Projekt überhaupt in Berührung gekommen, und das auch nur weil ein anderer Programmierer diese wild mit new/delete gemischt hat, und ich die Fehler ausbauen durfte.

    Man nutzt in C++ in der Regel andere APIs und nur einen Teil der vorhandenen Schnittmenge beider Sprachen. Auch die Denk- und Lösungsansätze sind häufig andere.



  • DerNewb schrieb:

    Hi, wie der Titel schon verraten mag würde ich gerne wissen ob es sich lohnt C++ zu lernen wenn man C noch nicht kann.
    Ich bin ein (wie mein Name schon sagt ^^) extremer Grünschnabel. Ich habe nun einfach Sätze - ich weiß nicht - "programmiert" halt mit Zeilenumbruch und so, einfache Rechenarten berechnet und war gerade dabei mir anzugucken wie man Bedingungen einbaut.

    Das ganze wird so oder so ein Flamewar und beide Parteien haben recht.
    C++ ist eine Erweiterung zu C. Nun gibt es zwei Sichten: Die übliche Sicht ist, dass C-Entwickler eine veraltete Denke haben und man daher auf gar keinen Fall C lernen sollte, damit man diese veraltete Denke nicht übernimmt und die zweite Sicht, die ich eher teile, dass C nunmal die Grundlage von C++ ist. Ich habe erst C gelernt, und als ich C++ lernte, hat sich gezeigt, dass ich in vielen Dingen schon die C++-Denke hatte.

    Vollkommen unabhängig davon, wie Du Dich entscheidest, Du wirst zu Beginn die wichtigsten Datentypen kennenlernen, Du wirst lernen Funktionen zu schreiben und diese zu rufen, Bedingungen und Schleifen zu formulieren. usw. Ohne die Grundlagen von C++, die nunmal C komplett ausmachen, kannst Du auch kein C++ programmieren, denn C++ formuliert keine (bzw. ab C11 wenige) neue Konstrukte für Bedingungen und Schleifen - und das Grundprinzip ist letztlich doch bei allen identisch.
    Wenn Du nun ein C++ Buch kaufst, wirst Du dieselben Grundregeln lernen, als würdest Du ein C Buch kaufen. Du wirst einige Details anders lernen, dass Du std::cout zur Ausgabe nutzt statt printf(), aber printf() ist in C++ genauso enthalten und löst weiterhin dasselbe Problem.

    Die Diskussion ist also heute eher akademischer Natur und wenn ich ehrlich bin, würde ich mich darauf gar nicht erst einlassen. Wenn Du die Grundlagen lernen möchtest, kauf Dir ein C Buch, wenn es Dir gefällt oder ein C++-Buch, wenn Dir dieses besser gefällt: Es steht dasselbe drin - im C++ Buch nur kürzer.

    Mein Tipp ist eher, kauf Dir kein Buch, was dicker als 300 Seiten ist. Dickere Bücher arbeitet kein Mensch durch und häufig ist da viel Blabla-Text nur drin, um das Buch dick zu machen.
    Viele C++ Bücher arbeiten die Grundlagen dann sehr schnell durch, um mehr Platz für C++-Features zu haben und wer C++ lernt, kann häufig schon die Grundlagen aus einer anderen Programmiersprache.

    DerNewb schrieb:

    Nun hab ich irgendwie das blöde Gefühl, dass ich C erstmal lernen sollte, weil ich in einem Begleitheft zu einem Kurs gelesen habe, dass die Kenntnisse über C vorausgesetzt waren für die Kurse. Nun ... was ist denn jetzt?

    Das bedeutet in meiner Meinung nach, dass Du z.B. Funktionen, Bedingungen und Schleifen drauf haben solltest und vielleicht eine Vorstellung davon, wie Du ein Problem alleine mit diesen Mitteln formuliert bekommst, bevor Du in diesen Kurs gehst und mehr darüber lernst, wie man Probleme und Quelltexte besser aufbauen kann, als es C-Anfänger üblicherweise tun. Die Quelltexte eines C-Profis unterscheiden sich kaum von einem C++-Semiprofessionellen.
    Als C++ Profi wirst Du jedoch Möglichkeiten haben, die deutlich über C hinaus gehen - ich gehe aber nicht davon aus, dass Dein Kurs das leisten wird.

    Um "Profi" zu werden wird ein Buch oder Kurs soweiso nicht reichen, Du wirst mit vielen Leuten diskutieren und nicht wenige werden Dir erklären, dass Du das alles total falsch machst. Je mehr Meinungen Du gehört hast, desto eher wirst Du eine gute Lösung für Dein Problem finden. Ganz am Anfang aber ist Dein Problem aber die Grundlagen der Programmierung zu lernen und da ist es einfach wichtig, ein halbwegs passendes Buch zu öffnen und mit dem Lernen anzufangen und später im Kurs den Mund aufzumachen, wenn Du etwas nicht verstanden hast.



  • Jetzt wird die Diskussion aber echt unsinnig...
    Als ob mit der Frage gemeint ist, ob man for-Schleifen & co kennen sollte 🙄

    Wenn mit der Frage gemeint ist, ob man pures C beherrschen muss, um C++ zu können, dann von mir ein klares nein!

    Ich könnte zumindest kein fehlerfreies C-Programm ohne Kompiler-Check schreiben (schon allein, weil ich mit Sicherheit nicht daran denken würde, Variablen am Funktionsanfang zu deklarieren).
    Komme aber trotzdem gut klar mit C++.



  • C sind Grundlagen schrieb:

    Wie will man eine Liste verstehen, wenn man nicht einmal weiß, wie man es in C mit Zeigern realisieren würde?

    Wie will man Zeiger in C verstehen wenn man das sowas nie in Assembler geschrieben hat? Wie will man Assembler verstehen wenn man nie eine CPU designed hat? ... Wie will man Strom verstehen wenn man nie ... 😉
    Man setzt halt auf irgendeiner Abstraktionsebene an. Es ist manchmal gut wenn man auch die tieferliegenden kennt, aber nicht immer nötig. Das ist ja grad das tolle an Abstraktion solange sie nicht leaky ist. 🙂



  • asc schrieb:

    C sind Grundlagen schrieb:

    Wie will man eine Liste verstehen, wenn man nicht einmal weiß, wie man es in C mit Zeigern realisieren würde?

    Was hat das mit C zu tun? Das kann man in C++ genauso ohne C lernen zu müssen. C++ besitzt die Zeiger ja ebenso, dennoch muss man nicht C-APIs lernen um dieses Thema zu verstehen.

    Wenn man C auf die C-Standard-Bibliothek reduziert - dann stimme ich dir halb zu, mittlerweile ist doch ein großer Teil davon als C++-Variante verfügbar. (Vor C++11 gab's aber zb noch kein <chrono> oder <random> )

    Aber mit C-Programmierung assoziere ich in erster Linie die "dreckige" Lowlevel-Arbeit. Und bei der ist es nicht schlecht sie zu verstehen, nur weil es std::string gibt bedeutet das imho nicht dass man keine Ahnung haben sollte wie man in C mit Strings umgehen würde.



  • Ethon schrieb:

    Aber mit C-Programmierung assoziere ich in erster Linie die "dreckige" Lowlevel-Arbeit. Und bei der ist es nicht schlecht sie zu verstehen, nur weil es std::string gibt bedeutet das imho nicht dass man keine Ahnung haben sollte wie man in C mit Strings umgehen würde.

    Jedes gute C++ Buch geht auf Zeiger ein, dazu muss man sich nicht mit C-Strings rumquälen. Ich finde diesen Weg auch gut, ein Anfänger lernt schrittweise besser, man sollte nicht alle Komplexität gleich an den Anfang stellen. In C++ kann man sich schon an einfache Programme mit Ein-/Ausgabe heran tasten, ohne sich gleich um Zeiger zu kümmern.

    Nutzt ihr Geräte erst, nachdem ihr sie anfangs zerlegt habt? Man kann auch erst das "Nutzen" lernen, bevor man in die Details geht.

    Xin schrieb:

    Ohne die Grundlagen von C++, die nunmal C komplett ausmachen...

    Dem widerspreche ich schon. Die Grundlagen die man für die sinnvolle C++ Programmierung benötigt, machen C eben nicht komplett aus. Man benötigt nicht Alles was die Sprache C anbietet um gutes C++ zu schreiben. Ebenso wie man kein C++, Java und Delphi können muss, um C# zu lernen (Und C# basiert u.a. auf diesen Sprachen).



  • asc schrieb:

    Jedes gute C++ Buch geht auf Zeiger ein, dazu muss man sich nicht mit C-Strings rumquälen. Ich finde diesen Weg auch gut, ein Anfänger lernt schrittweise besser, man sollte nicht alle Komplexität gleich an den Anfang stellen.

    Damit "quäle" ich meine C-Schüler in der Hälfte der Zeit. Ich wüsste nichts, woran man besser lernen kann, mit Zeigern umzugehen, sämtliche sonstigen Konstrukte drumrumbauen kann und sich auch noch mit einem einfachen printf() zeigen zu lassen, ob das nun funktioniert hat.
    Wer den C-String nicht beherschen kann, braucht in meinen Augen nicht mit OOP oder abstrakteren Konzepten anzufangen.

    Die wichtigste Erkenntnis, die meine Schüler daraus mitnehmen ist: Zeiger sind nicht kompliziert, sondern primitiv. Und darauf kann man dann komplexere Ideen wie eigene Wrapper-Klassen oder shared_ptr aufbauen.
    Jeder programmiert bei mir seine eigene String-Klasse... Substrings ausschneiden oder Strings einfügen... alles tolle algorithmische Übungen, um Programmieren zu lernen.

    asc schrieb:

    Nutzt ihr Geräte erst, nachdem ihr sie anfangs zerlegt habt? Man kann auch erst das "Nutzen" lernen, bevor man in die Details geht.

    Ich mache auch Geräte-Tauchen. Die Geräte werden vor jedem Tauchgang unter Aufsicht des Partners zusammengebaut, getestet, dann zusätzlich vom Partner getestet und am Ende des Tauchgangs zerlegt und gereinigt. Das "Buddy-System" beim Tauchen nennt man in der Informatik "Pair-Programming". Habe ich schon mal gesehen, macht aber kaum einer.

    Wenn unter Wasser etwas passiert, versteht man warum und wie man das Problem beseitigt. Und bei zwei ausgebildeten Tauchern, wissen beide, wer welche Aufgabe hat, um das Problem zu lösen. Dafür muss man die Details der eigenen Ausrüstung kennen und die des Tauch-Partners.

    Es gibt eine Ausnahme: Schnuppertaucher. Da baue ich mein Zeug und das Gerät des Schnupperers zusammen und teste beide. Wenn da etwas passiert, muss ich reagieren. Passiert mir was, muss ich alleine klarkommen. Darum darf ich mit dem Schnupperer nicht tief tauchen und der Schnupperer ist immer in Griffreichweite.
    Wenn ich etwas professionell lernen will, dann muss ich kapieren, was und warum ich etwas tue. Das nicht zu wissen ist beim Tauchen potentiell gesundheitsgefährdend. Es ist legal ohne Tauchlehrer und Tauchschein (genauer gesagt ohne Ahnung) mit einer irgendwie zusammengebauten Ausrüstung ins Wasser zu steigen und zu tauchen. Aber das dann wirklich sehr gefährlich, bis hin zu tödlich und dafür muss nichtmals die Ausrüstung versagen.
    Und so ist es in der Programmierung nunmal auch.
    Wer sein Programm nicht zerlegen und testen kann, kann nicht sicherstellen, dass es im Einsatz nicht versagt. Darum wissen diejenigen, denen ich C/C++ beibringe, was ein C-String ist.
    Nun bleibt die Frage, was der Threadstarter werden will: Programmierer oder Schnupperprogrammierer, wo ein richtiger Programmierer immer in Reichweite sein muss?

    Wenn er nur mal zum Spaß reinschaut, spricht nichts gegen std::string. Wenn er es ernst meint, zum Einstieg eine ganze Menge.

    asc schrieb:

    Xin schrieb:

    Ohne die Grundlagen von C++, die nunmal C komplett ausmachen...

    Dem widerspreche ich schon.

    Und ich lasse mich nicht auf einen Flamewar ein, weil er weder Dir noch mir, noch dem Threadstarter etwas bringt und in diesem Forum schon tausendmal geführt wurde. Es interessiert einfach nicht, weil ich recht habe und Du auch. Man braucht nicht alles, um gutes C++ zu schreiben. Es schadet aber nicht, sich auch in C umzusehen - im Gegenteil.
    Wenn wir beide Recht haben - wozu diskutieren?



  • Xin schrieb:

    Man braucht nicht alles, um gutes C++ zu schreiben. Es schadet aber nicht, sich auch in C umzusehen - im Gegenteil.
    Wenn wir beide Recht haben - wozu diskutieren?

    Weil eben das "Es schadet aber nicht, sich auch in C umzusehen - im Gegenteil" in allen Projekten in denen ich mitgearbeitet habe, und ehemalige C-Programmierer waren, nicht stimmte. Wobei ich auch keine Systemprogrammierung mache - dort mag es wirklich sinnvoll sein C gut zu beherrschen.



  • asc schrieb:

    Xin schrieb:

    Man braucht nicht alles, um gutes C++ zu schreiben. Es schadet aber nicht, sich auch in C umzusehen - im Gegenteil.
    Wenn wir beide Recht haben - wozu diskutieren?

    Weil eben das "Es schadet aber nicht, sich auch in C umzusehen - im Gegenteil" in allen Projekten in denen ich mitgearbeitet habe, und ehemalige C-Programmierer waren, nicht stimmte.

    Lies nochmal mein erstes Posting: Wer heute C lernt, lernt heute C und nicht vor 20 Jahren. Ich habe vor ... 20 Jahren C programmiert und als ich meine Software auf C++ hievte, lies sich das zu mindestens 95% automatisiert über einen Makro-Editor bewerkstelligen, weil ich offenbar C++ ähnliches C programmiert habe. Ich habe mein erstes C++-Buch wie eine Offenbarung gelesen, weil C++ genau die Sprache war, in der ich meine Software organisierte - nur dass ich eben in C programmierte.

    Wenn Deine Kollegen sich 20 Jahre nicht weiterentwickelt haben, dann ist das kein C-Problem, sondern ein Problem Deiner Kollegen, das Dir heute genauso gut im Java- oder C#-Umfeld genauso passieren kann. Meine Kollegen programmieren noch Fortran und manche switchen zwischen Fortran und C, andere zwischen Fortran und C#, während unser Team mit C++ arbeitet.
    Veraltete C-Programmierung kann also auch die gute Nachricht sein. 😉

    Ich habe kein Problem C-Funktionen in C++ zu nutzen. Sie sind in C++ verfügbar, dokumentiert - auch wenn manche es als Frevel betrachten. Und genau darüber mag ich nicht diskutieren, ob das jetzt Frevel ist oder nicht. Wenn es das Problem sauber gelöst ist, dann darf man darüber diskutieren, ob es bessere Alternativen gibt, aber nicht, ob das jetzt C++ ist nicht. Auch das ist C++.
    Wenn ein C++-Programmierer aber von Frevel spricht, weil er C++ nicht versteht, weil er die in C++ vorhandenen Funktionen ungern benutzt, dann ist das kein C-Problem. Dann hätte es vielleicht nicht geschadet, sich auch in dem Bereich ein wenig umzuschauen. Meiner Meinung nach.
    Der Threadstarter kann tun und lassen, was er will. Ich werde mich mit niemandem fetzen, wer der TS macht Fortschritte, egal ob er mit einem modernen C- oder C++-Buch anfängt. Und ob er sich danach nicht mehr weiterentwickelt, spielt in 20 Jahren auch keine Rolle mehr. Wenn er dann noch C++11 programmiert, wo C++34 aktuell ist - da wird genauso drüber geschimpft, wie heute über die C-Entwickler von vor 20 Jahren.
    So what?


Anmelden zum Antworten