C zu C++ - Einfacherer Übergang?


  • Administrator

    roooooolfffffff schrieb:

    Dravere schrieb:

    roooooolfffffff schrieb:

    Was auch immer "Leute aus anderen Sprachen" sind. Es gibt auch genügent Leute mit Ahnung, die über C++ Lästern, auch wenn es hier keiner wahr haben will.

    Eben nicht. Jemand der Ahnung von C++ hat, lästert nicht über die Sprache, sondern macht konstruktive Kritik. Wenn jemand einfach nur lästert, ist er anscheinend nicht in der Lage, konstruktive Kritik zu machen und wahrscheinlich deswegen, weil er einfach die Sprache nicht genügend versteht, um sinnvolle Kritik zu üben.

    Nein, lästern kann man auch, wenn man die Sprache versteht, man muss nicht immer schön konstruktive Kritik äußern. Und namespace invaders Zeug hab ich nicht gelesen...

    Gut, ich formuliere es deutlicher:
    Wenn jemand einfach nur lästert, ist er anscheinend nicht in der Lage, konstruktive Kritik zu machen und wahrscheinlich deswegen, weil er einfach die Sprache nicht genügend versteht, um sinnvolle Kritik zu üben.

    Mir ist klar, dass man auch einfach mal aufgebracht sein kann und man dann einmal lästert, aber danach zurück zur Sachlichkeit kommt. Die einzige Alternative die höchstens noch bleibt, dass derjenige einfach nicht in der Lage ist, konstruktive Kritik zu üben und somit vernünftig zu diskutieren, dann hat er aber reichlich wenig in einem Forum zu suchen und kann man getrost als Troll bezeichnen 😉

    noobLolo schrieb:

    leider ist mir kein reines c forum bekannt, daher muß ich mich hier rumtreiben 😉

    Solange ihr euch an gewisse Richtlinien haltet, dulden wir euch ja auch und bieten euch Obdachlosen einen Unterschlupf 😃

    mngbd schrieb:

    Hmm. In Wahrheit ist das ungefähr so:
    http://www.welt.de/multimedia/archive/1255701929000/00927/Reise_asterix_karte_927258g.jpg
    🙂

    Genau, die Römer haben keine Chance gegen uns, denn wir haben den Zaubertrank, nämlich C++ 😃

    Und nicht zu vergessen:
    http://ecx.images-amazon.com/images/I/51RX7JEB1BL._SL500_AA300_.jpg 😉

    namespace invader schrieb:

    - Meine Aussagen sind nicht "völliger Schmarn", ich habe alle meine Aussagen sachlich begründet. Teilweise wurde widersprochen, ohne meine Argumente wirklich zu wiederlegen, sondern meist nur mit unbegründeten Gegenbehauptungen und Ausweichen auf andere Themen, und verbunden mit persönlichen Beleidigungen, so dass ich mich nicht dazu veranlasst gefühlt habe, darauf noch zu antworten und Trolle zu füttern. Es wurde also gar nichts "aufgezeigt".

    Du bist nur allen Gegenargumenten ausgewichen, wie du es bereits wieder tust. Was soll die Scheisse?

    namespace invader schrieb:

    - Dass ich "wenig Ahnung" [von C++] hätte ist unzutreffend und wurde nur von Leuten behauptet, die meine Feststellungen nicht wahrhaben wollen. (Ich habe knapp 15-jährige Erfahrung mit C++ und wohl mehr Ahnung davon als viele andere, die sich hier zu Wort gemeldet haben)

    Leider sagen die Anzahl Jahre überhaupt nichts aus.

    namespace invader schrieb:

    - Diese verzweifelten Doppelmoral-Vorwürfe sind ja wohl lächerlich.

    Worauf du aber nie sinnvoll eingegangen bist. Shade Of Mine hat es dir eigentlich ganz deutlich aufgezeigt, wo deine Doppelmoral liegt. Deutlicher geht es wirklich nicht mehr, aber du gehst wieder nicht darauf ein, sondern weichst nur aus.

    namespace invader schrieb:

    Über dem ganzen Forum steht "C/C++ Forum". Nicht "C++ Forum". Und abgesehen davon geht es hier ja noch um diverse andere Sprachen als nur C und C++; hier gibt es auch ein Java-Unterforum usw.

    Witzig 🙂

    namespace invader schrieb:

    Ich hab ja gar keine Lust, über die Vor- und Nachteile von C++ zu diskutieren, zumindest nicht so. Es hat jemand eine Frage gestellt, die hab ich nach bestem Wissen beantwortet, und dann kamen gewisse C++-Fanboys aus ihren Löchern und haben mit dem Flamewar angefangen. 🙄

    namespace invader schrieb:

    - Gelästert hab ich nur ganz am Anfang kurz, bevor das in einen Flamewar ausgeartet ist. IMHO war das eine konstruktive Hilfestellung für den OP, um ihm die zu erwartenden Probleme des überstürzten C++-Lernens in wenigen Worten zu verdeutlichen.

    Moment, wie jetzt?
    1. Du hast nach bestem Wissen geantwortet und danach haben C++ Fanboys einen Flameware angefangen.
    2. Du hast vor dem Flameware gelästert.
    3. Dein Lästern sei eine konstruktive Hilfestellung gewesen.
    4. Mit deinem Geläster hast du den Flameware nicht ausgelöst.

    Kannst du über so eine Aussage auch nur noch lachen wie ich? Wie soll man dich ernst nehmen, wenn du so einen Unsinn erzählst? Da bleibt mir die Sprache weg ... unglaublich. You made my day!

    Grüssli



  • Noch einmal zum eigentlichen Thema:
    Ja, der Übergang ist sehr viel einfacher, besonders einfach, wenn man bereits sicher mit C umgehen kann, z.B. nach einigen größeren Projekten. Allerdings ist es nicht erforderlich, alle Features der Standardbibliothek auswendigzulernen, es wäre Zeitverschwendung.
    Begründung:
    1. C stellt eine Abstraktion der Hardware dar, so eine Art High-Level-Assembler-Sprache. Es gibt kaum Alternativen zu C, anhand derer man ein so zutreffendes Gefühl für das Kompilat, den Stack, den Heap, das OS etc. gewinnen kann. Würde man C abschaffen, müsste man praktisch Asm oder C++ dazu einsetzen. Asm wäre zu kleinteilig (daher unübersichtlich u. ablenkend) und langwierig, "echtes" C++ würde das Gehirn mit "Candy" verkleistern, über die tatsächlichen Vorgänge durch Verführung zur Verwendung seiner Features hinwegtäuschen. Gewisse typische Problemstellungen, wie sie z.B. bei Speicherallokation, Design, Handhabung größerer Projekte etc. auftreten, sollten erst einmal in Gänze erfahren worden sein, um die Hintergründe mancher C++ -Konzepte zu verstehen.
    C ist weder lächerlich noch ist es einfach, mit C zu arbeiten. Sobald ein bestimmtes Problem zu lösen ist, benötigt man eine Methodik, die man sich entweder mühsam angeeignet hat, oder die erst während der Ausführung entsteht. Und dort liegen die Stärken von C++, indem man auf gewisse Ansätze geschubst wird. Ob diese Ansätze als Sprachfeatures benötigt werden, darüber lässt sich streiten, denn man kann mit geeigneter Methodik ausgezeichneten C-Code schreiben, welcher C++ dabei überflüssig macht. Und zu dieser Methodik kommen meistens erst sehr erfahrene Programmierer. Obwohl ich noch nicht so erfahren bin, liebe ich Pointer-Arithmetik und kompliziert anmutende Casts, alles Dinge, die C++ zu vermeiden versucht, indem sie dennoch im Verborgenen vom Compiler ausgeführt werden. Z.B. liebe ich es, nach Gusto Speicher anzufordern, den dann zu selbst definierten Typen zu casten, wie mir dünkt, um damit fiese Dinge zu tun, die Herr Stroustrup vermutlich nicht mag. Meistens ist der Code trotz dieser ach so häßlichen Dinge stabil und größtenteils aus sich selbst heraus Thread-sicher und verständlicher als der meiste C++ -Code. Erst wenn man diese Spielwiese hinter sich hat, hat man verstanden, warum C++ dem Profi einen so mächtigen Werkzeugkasten bietet, den zu erlernen es erheblichen Aufwandes und Respektes bedarf. Würde man C (und C++) abschaffen und alles darüber bekannte vergessen, würde sich aus Macro-Assemblern heraus der Sprachkern von C automatisch neu herausbilden, C++ jedoch nicht. Man sollte jedoch nicht so viel Zeit mit den Bibliotheken verschwenden, wenn man später auf C++ umsteigen sollte, weil es in C++ interessanteren Ersatz dafür gibt (wenn auch die aus C weiterhin verfügbar sind).
    Man sollte also bereits zuverlässigen Code schreiben können (ohne wilde Zeiger, Speicherlecks etc.), bevor man auf C++ umsteigt. Denn keines dieser von C bekannten Probleme wird durch C++ behoben, sondern C++ liefert eher einen Werkzeugkasten, der durch fast beliebig hoch wählbare Abstraktionsniveaus Probleme mehr oder weniger elegant und effizient zu lösen oder manchmal auch nur zu verbergen ermöglicht.
    C++ beseitigt nur wenige Probleme aus C, sondern schafft überwiegend neue. Wer glaubt, durch C++ die Probleme von C hinter sich lassen zu können, und daher auf das C-Subset auch nur teilweise verzichten zu können, ist auf dem Holzweg, weil der C++ -Programmierer die Sicherheit seines Codes durch Abstraktion und Kapselung erst selbst herstellen muss. C++ zeigt immer wieder, dass es in wesentlichen Teilen doch nur ("C with Classes" || moderne (typedefs || defines)) ist.
    Eigene Typen (Klassen) werden erst sicher und universell verwendbar, indem man C-typische Probleme C++ -typisch löst. Eine Vermeidung von C-typischen Problemen findet nicht statt, sie werden meistens nur versteckt, daher ist der "Candy" gefährlich, wenn man ihn einsetzt, bevor man ihn nicht mehr bräuchte.
    Also fassen wir zusammen: Erst wenn man mit C souverän aber auch alles machen kann und C++ technisch nicht mehr benötigt, wird C++ interessant (weil die alten Probleme aus C durch Abstraktion nur versteckt, nicht vermieden werden, und dadurch noch gefährlicher werden können, oft durch Seiteneffekte oder Operatoren-Priorität). Das ist vor allem der Preis für die Kompatibilität zu altem C-Code. Es ist ein Irrtum, dass C-Programmierer sich schwer täten C++ zu verstehen, sondern es ist eher andersherum: Sie verstehen C++ als das, was es in seinem Inneren wirklich ist (s.o.) und vermeiden durch die parallele Sicht auf Abstraktion und Binärrepresentation böse Fehler. Der Lernprozess verläuft also noch einmal anstrengender als beim Erlernen von C, weil es an Naivität mangelt, was unweigerlich zu starken Geburtsschmerzen führt. Sollten diese ausbleiben, hat man vieles nicht verstanden, sondern blind auswendig gelernt. Nach der Geburt stellt sich jedoch riesige Freude ein, wenn man es überlebt hat (wenn also Freunde und Familie noch mit einem sprechen).
    2. Nahezu jedes Standardwerk zu C++ setzt grundlegendes Verständnis zu C voraus. Autoren, insbes. Hr. Stroustrup, täuschen oft vor, das das nicht nötig wäre und versuchen einem eine Zeit lang die rosarote Brille aufzusetzen, um einen in dem naiven Glauben (s.o.) zu lassen, in C++ wäre alles besser. Wegen seiner Mächtigkeit, Effizienz und Vorhersagbarkeit ist C++ dennoch großartig, vielleicht aber so sehr, dass es beim Lernen entmutigt.
    Dann bleibt zum Glück noch C oder die C-Untermenge von C++, auf die man sich auch gleich stürzen kann, wenn man diszipliniert vorgeht.

    Ach noch eine Sache zu RAII: Nehmt das doch nicht so wörtlich, denn es handelt sich nicht um ein Sprachfeature von C++ im engeren Sinne, sondern um eine Methodik, die selbstverständlich sein sollte und nicht separat gelernt werden muss, auch der Begriff ist unwichtig.
    Warum wollen sich nur Leute um das Freigeben von Ressourcen keine Gedanken mehr machen, wenn sie sich welche beim Anfordern gemacht haben?
    Folgendes ist z.B. sehr gefährlich:
    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. Denn es ist nicht Bestandteil von C++, was beim Öffnen von Dateien passiert, sondern ein Zusammenspiel aus Implementierung und Betriebssystem. Dateien sollten daher immer geschlossen werden, es genügt nicht, irgendwelche selbst erzeugten Objekte abzuräumen oder freizugeben. Das geht aber nur solange das Objekt noch vorhanden ist!
    Ich bin es nämlich leid, z.B. meine externe Festplatte nicht abmelden zu können, nur weil noch ein Handle offen ist, den das OS vergeben hat.
    Dann kann man erst wieder mit tollen Tools von Sysinternals ran oder das OS neu booten, um die Handles freizugeben. Selbst im Windows Explorer stecken solche Fehler. Das OS arbeitet mit eigenen Objekten, da erledigt sich nur wenig von selbst.



  • @egal_
    Formatierung, Absätze usw. würden Deinem Text gut tun.
    Ansonsten volle Zustimmung. Saubere Analyse des Verhältnisses C zu C++.



  • 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?

    ...


Anmelden zum Antworten