C zu C++ - Einfacherer Übergang?



  • Ganz schlechte Analyse. C++ einfach nicht verstanden. 👎 👎



  • egal_ schrieb:

    Manchmal wird fahrlässig der Eindruck erweckt, man müsste nur den Stack durch Verlassen des Scopes abgeräumt bekommen und alles wäre gut. Das aber halte ich für ein schlimmes Gerücht.

    Schätzchen, so ist es aber.



  • volkard schrieb:

    Ganz schlechte Analyse. C++ einfach nicht verstanden.

    Ganz unqualifiziertes Urteil. Programmierung einfach nicht verstanden?



  • Nahezu jedes Standardwerk zu C++ setzt grundlegendes Verständnis zu C voraus.

    Habe selbst noch keins gefunden. Der C++ Primer, D A S Standardwerk, setzt absolut kein C voraus. Da fängt man schön langsam an, z.B. wird std::string weit vor den klassischen C-Strings eingeführt.

    Man sollte also bereits zuverlässigen Code schreiben können (ohne wilde Zeiger, Speicherlecks etc.), bevor man auf C++ umsteigt.

    Aber gerade dafür bietet C++ doch vollkommen andere Mechanismen, bzw. Herangehensweisen.
    Z.B. sind Speicherlecks mit Smartpointern und RAII leicht in den Griff zu bekommen.

    Ganz schlechte Analyse. C++ einfach nicht verstanden. 👎 👎
    ...
    Ganz unqualifiziertes Urteil. Programmierung einfach nicht verstanden?

    Schon lustig, sich gegenseitig einfach Unfähigkeit vorzuwerfen. xD

    ...



  • ... schrieb:

    Nahezu jedes Standardwerk zu C++ setzt grundlegendes Verständnis zu C voraus.

    Habe selbst noch keins gefunden. Der C++ Primer, D A S Standardwerk, setzt absolut kein C voraus. Da fängt man schön langsam an, z.B. wird std::string weit vor den klassischen C-Strings eingeführt.

    Genau das ist falsch. Da C einfach die Grundlage von C++ ist, und das kann keiner abstreiten, kapiert der Anfänger gar nicht die darunterliegenden Techniken.
    Das führt später zu Problemen die der Programmierer dann hat wenn er ein Anfänger C Programm bzw. ein Programm welches char-Arrays nutzt betrachtet und nur Bahnhof versteht. Das sind dann die Leute die ins Forum kommen und sagen: "Guckt mal mein Programm stürzt ab".
    Ausserdem ist std::string für manche Sachen auch einfach Overkill. Der Programmierer der nie über den Tellerrand gesehen hat wird daran dann aber auch nicht viel ändern können weil ers nicht besser weiss. Nicht zuletzt ist es auch eine Sache des Ego (zumindest bei manchen). Ich käme z.B. nicht damit klar immer nur fertige Bausteine zu benutzen ohne zu wissen was dahinter steckt. Deswegen habe ich auch Assembler gelernt.



  • volkard schrieb:

    Ganz schlechte Analyse. C++ einfach nicht verstanden. 👎 👎

    Kannst du mal sagen, was die wichtigen Unterschiede zwischen C und C++ sind?



  • @player4245
    wie man unschwer aus dem Zitat hätte herauslesen können steht da:

    std::string [wird][...]vor [...] C-Strings eingeführt

    Offensichtlich wird das Wissen über C-Strings also auch vermittelt. Aber erst nachdem der C++ Weg gezeigt wurde. Das ist Okay, denn sonst lehrt man erstmal C-Strings (inklusive einer Woche C-Standardbibliothek und "wie erzeuge ich mit C keine Sicherheitslücken") und muss dann sagen: "Okay, aber das machen wir so eigentlich nicht. vergiss das schnell, das erzeugt nur schlechten Code". Besser ist es doch zu sagen: "So macht mans" und dann hinzuzufügen "und das funktioniert intern so:[...]".



  • Hallo,

    @player4245:
    Ein Anfänger muss auch gar nicht auf Performance oder Effizienz achten, der soll erst mal ordentliches Programmieren lernen. Performance und Effizienz sind dann für die fortgeschrittenen Leute. Die ganz hart gesottenen lernen dann auch noch Assembler.

    Klar ist std::string für die CPU ein klein wenig mehr Arbeit als meistens nötig wäre, aber für den Programmierer-Anfänger ist es erst mal deutlich leichter als char[] und er schießt sich nicht so schnell ins eigene Knie.

    Grüße
    Erik



  • Naja gut aber ich würde mich auf jeden Fall darauf festlegen das ein guter C++-Programmierer auch C können sollte. Ob er das davor oder danach lernt ist dann egal (Geschmackssache).


  • Administrator

    player4245 schrieb:

    Naja gut aber ich würde mich auf jeden Fall darauf festlegen das ein guter C++-Programmierer auch C können sollte. Ob er das davor oder danach lernt ist dann egal (Geschmackssache).

    Wozu? Die C Untermenge in C++ lernt er automatisch, wenn er vernünftig C++ lernt. Nur entspricht das Lernen dieser C Untermenge nicht dem reinen C lernen. Ich würde C und C++ als getrennte Sprachen betrachten, was sich auch zunehmen mit den neuen Standards abzeichnet. C++ ist nur zu C89 wirklich rückwärtskompatibel und man entwickelt in C++ anders als in C. Wieso muss somit ein C++ Programmierer wissen, wie man z.B. in C99 entwickelt?
    Eine Programmiersprache lernen heisst zudem nicht nur, dass man die Syntax und Bibliothek lernt. Es sind auch die Konzepte und Vorgehensweisen. Und da der C++ Programmierer ganz andere Mittel zur Verfügung hat, wieso muss er dann die Konzepte und Vorgehensweisen von C lernen?

    Grüssli



  • Dravere schrieb:

    Ich würde C und C++ als getrennte Sprachen betrachten

    Wie auch sonst jeder vernünftige. Selbst Stroustrup sieht es so.



  • Ich würde C++ und C++0x als getrennte Sprachen bezeichnen ^^ .



  • player4245 schrieb:

    ... schrieb:

    Nahezu jedes Standardwerk zu C++ setzt grundlegendes Verständnis zu C voraus.

    Habe selbst noch keins gefunden. Der C++ Primer, D A S Standardwerk, setzt absolut kein C voraus. Da fängt man schön langsam an, z.B. wird std::string weit vor den klassischen C-Strings eingeführt.

    Genau das ist falsch. Da C einfach die Grundlage von C++ ist, und das kann keiner abstreiten, kapiert der Anfänger gar nicht die darunterliegenden Techniken.

    In fast allen objektorientierten Programmiersprachen (Delphi, Java, C#, Python, ..., außer C) gibt es eingebaute Klassen für Strings und bei keiner davon wird von einem Anfänger erwartet, dass er zuerst die Interna lernt. Warum sollte C++ eine Ausnahmen sein? Dass man bei C++ natürlich trotzdem die C-Strings behandelt sollte, weil man an einigen wenigen Stellen sie eben doch noch braucht, bestreite ich nicht, aber ich halte es für falsch, dass man std::string nicht ohne C-Strings verstehen kann.



  • Naja ich denke wenn man Klassen und dynamische Speicherverwaltung versteht wird man auch die Interna von std::string verstehen. Von daher ergibt sich das von selbst.



  • Dravere schrieb:

    Eine Programmiersprache lernen heisst zudem nicht nur, dass man die Syntax und Bibliothek lernt. Es sind auch die Konzepte und Vorgehensweisen. Und da der C++ Programmierer ganz andere Mittel zur Verfügung hat, wieso muss er dann die Konzepte und Vorgehensweisen von C lernen?

    Welche aufwendig zu lernenden Konzepte und Vorgehensweisen von C sind denn in C++-Code garantiert nicht anzutreffen, so dass ein C++-Programmierer nichts davon wissen muss?



  • ipsec schrieb:

    In fast allen objektorientierten Programmiersprachen (Delphi, Java, C#, Python, ..., außer C) gibt es eingebaute Klassen für Strings und bei keiner davon wird von einem Anfänger erwartet, dass er zuerst die Interna lernt. Warum sollte C++ eine Ausnahmen sein?

    Nicht mal die fstreams funktionieren mit dem "Standard" C++ string.



  • Welche aufwendig zu lernenden Konzepte und Vorgehensweisen von C sind denn in C++-Code garantiert nicht anzutreffen, so dass ein C++-Programmierer nichts davon wissen muss?

    Z.B. die Fehlerbehandlung sollte in etwas größeren C++ Programmen anders gehandhabt werden als in C.

    Ich würde die Frage aber anders herum stellen: Welche grundlegenden Konzepte und Vorgehensweisen aus C++ kommen aus C?

    Nicht mal die fstreams funktionieren mit dem "Standard" C++ string.

    Das verstehe ich ehrlich gesagt auch nicht. Gibt's da eine Erklärung für?

    ...



  • namespace invader schrieb:

    Welche aufwendig zu lernenden Konzepte und Vorgehensweisen von C sind denn in C++-Code garantiert nicht anzutreffen, so dass ein C++-Programmierer nichts davon wissen muss?

    Resourcen Management, Fehlerbehandlung, Generizitaet, Schnittstellen Design, Anwendungs Design (Abstraktion)



  • namespace invader schrieb:

    Welche aufwendig zu lernenden Konzepte und Vorgehensweisen von C sind denn in C++-Code garantiert nicht anzutreffen, so dass ein C++-Programmierer nichts davon wissen muss?

    Ich denke, viele Dinge aus dem Alltag. Die bereits genannte Fehlerbehandlung: In C prüfst du viel häufiger Rückgabewerte oder gehst per goto an eine Aufräumstelle am Ende der Funktion. Oder du implementierst Typunterscheidungen über Funktionszeiger, wo C++ler virtuelle Methoden einsetzen. Die Tendenz, in Objekten zu denken, ist in C vielleicht etwas weniger vorhanden. Du benutzt generell weniger Abstraktionsmechanismen und operierst häufiger direkt auf dem Speicher. Typsicherheit hat keinen so hohen Stellenwert wie in C++. Globale Variablen und Makros sind eher anzutreffen.

    Aber "garantiert nicht" würde ich nicht sagen, schliesslich gibt es unterschiedliche Codestile. Aber grundsätzlich kann man in C++ auf viele Möglichkeiten aus C verzichten – was nicht heisst, dass man seinen Horizont nicht erweitern darf und C-Mittel strikt vermeiden soll.

    ganzeinfach schrieb:

    Nicht mal die fstreams funktionieren mit dem "Standard" C++ string.

    Nur für den Dateinamen wird ein const char* benötigt (soll aber in C++0x geändert werden). std::string in Dateien schreiben/von Dateien lesen geht ganz gut.



  • Nexus schrieb:

    Ich denke, viele Dinge aus dem Alltag. Die bereits genannte Fehlerbehandlung: In C prüfst du viel häufiger Rückgabewerte oder gehst per goto an eine Aufräumstelle am Ende der Funktion. Oder du implementierst Typunterscheidungen über Funktionszeiger, wo C++ler virtuelle Methoden einsetzen. Die Tendenz, in Objekten zu denken, ist in C vielleicht etwas weniger vorhanden. Du benutzt generell weniger Abstraktionsmechanismen und operierst häufiger direkt auf dem Speicher. Typsicherheit hat keinen so hohen Stellenwert wie in C++. Globale Variablen und Makros sind eher anzutreffen.

    Trotzdem muss man als C++-Programmierer diese C-Dinge auch beherrschen. Nicht aller C++-Code verwendet durchgängig Exceptions und RAII. Irgendwann wird man mit C-artiger Fehlerbehandlung zu tun haben, sei es, weil man eine C-Bibliothek verwendet. Und wenn dann die Idee, dass Rückgabewerte auch Fehler anzeigen können, oder dass man bestimmte Dinge auch im Fehlerfall noch von Hand aufräumen muss, neu für einen ist, hat man erstmal ein Problem.

    Dass man versteht, wie Makros und globale Variablen und das "Arbeiten auf dem Speicher" funktionieren und worauf dabei zu achten ist, ist auch für C++ entscheidend, auch wenn man diese Dinge dort vielleicht weniger aktiv verwendet.

    Man wird sich mit diesen C-Mitteln beim Gleich-C++-Lernen nicht schon am Anfang befassen, sondern erst später, aber lernen wird man sie früher oder später so oder so. Dass man C (bzw. den für C++ relevanten Teil von C, was IMHO fast alles ist) mit C++ "gleich mit" lernt (was hier jemand gesagt hat) hört sich so an, als ob man diese Dinge, wenn man die Sprachfeatures und Vorgehensweisen von C++ gelernt hat, ohne zusätzlichen Aufwand ganz von alleine kann, aber das halte ich für Quatsch. Der Aufwand zum Lernen von C und C++ ist der selbe, egal was man zuerst lernt (auch wenn das C in C++ vom Umfang her natürlich nicht so stark ins Gewicht fällt, man vergleiche nur mal die Seitenanzahl von typischen C- und C++-Büchern). Wobei erst C und dann C++ zu lernen IMHO angenehmer und natürlicher ist und den Vorteil hat, dass man C und C++ dann besser auseinanderhalten kann.


Anmelden zum Antworten