C zu C++ - Einfacherer Übergang?
-
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).
-
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.
-
namespace invader schrieb:
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.
Die Realität sieht anders aus. Leute, die zuerst C gelernt haben, mischen C und C++ sehr sehr gerne..
-
Janjan schrieb:
Die Realität sieht anders aus. Leute, die zuerst C gelernt haben, mischen C und C++ sehr sehr gerne..
Das liegt dann aber vielleicht auch daran, dass sie, wenn sie beides können und objektiv vergleichen können und nicht nur in ihrem C++-Buch gelesen haben, dass alles aus C veraltet und möglichst zu vermeiden wäre, _absichtlich_ auf die C-Dinge zurückgreifen, weil sie die besser und für irgendeinen Zweck nützlicher finden. Ob man nun die Operatur-Überladerei der stl bevorzugt oder doch lieber printf, ist nun mal Geschmackssache.
-
namespace invader schrieb:
Janjan schrieb:
Die Realität sieht anders aus. Leute, die zuerst C gelernt haben, mischen C und C++ sehr sehr gerne..
Das liegt dann aber vielleicht auch daran, dass sie, wenn sie beides können und objektiv vergleichen können und nicht nur in ihrem C++-Buch gelesen haben, dass alles aus C veraltet und möglichst zu vermeiden wäre, _absichtlich_ auf die C-Dinge zurückgreifen, weil sie die besser und für irgendeinen Zweck nützlicher finden. Ob man nun die Operatur-Überladerei der stl bevorzugt oder doch lieber printf, ist nun mal Geschmackssache.
Das ist definitiv nicht so. Bestes Beispiel sind Makros, die von den "C-Hackern" gerne anstelle einer inline-Funktion benutzt werden.
-
Shade Of Mine schrieb:
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)
Warum sollte ein C++-Programmierer nichts davon wissen müssen?
-
namespace invader schrieb:
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.
Leider falsch.
Auch wenn du fehlerbehandlung über return codes machst, machst du resourcen management nicht über goto sondern über raii.
ich habe links gepostet die deine aussagen widerlegen und die von C und C++ groessen abgesegnet sind. Aber vielleicht bist du einfach schlauer als alle anderen?
C mit Klassen ist eine Krankheit, denn das vereint die Nachteile von C und C++. Das ist es auch was du als C++ zu kennst und kritisierst. Dort hast du nämlich unnötige komplexität und Probleme im resourcen management.
Echter C++ sieht anders aus.
-
namespace invader schrieb:
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.
Angenehmer ist wohl Geschmackssache. Wie schon erwähnt scheinen mir die Nachteile aber nicht unbedeutend zu sein:
Nexus schrieb:
Das Problem, wenn man zuerst C lernt, besteht vor allem auch darin, dass der Grossteil des Codes weiterhin funktioniert. Man ist nicht gezwungen, die C++-Äquivalente zu verwenden, weil die C-Mittel immer noch auszureichen scheinen.
Und zumindest im C++-Forum sieht man ab und zu Umsteiger, die sich sehr schwer tun und denken, sie könnten bekannte Dinge ohne Einschränkungen weiterverwenden. Die Gefahr besteht nicht, wenn man direkt mit C++ anfängt. Denn gerade bei einem "C mit Klassen" kann man die beiden Sprachen nicht mehr gut auseinanderhalten.
h??????????? schrieb:
Shade Of Mine schrieb:
Resourcen Management, Fehlerbehandlung, Generizitaet, Schnittstellen Design, Anwendungs Design (Abstraktion)
Warum sollte ein C++-Programmierer nichts davon wissen müssen?
Es geht darum, dass sich die Konzepte beider Sprachen in diesen Punkten unterscheiden, nicht dass C oder C++ keine solchen Konzepte hat.
-
Jungs, eure Argumente sind wenig stichhaltig:
Janjan schrieb:
Bestes Beispiel sind Makros, die von den "C-Hackern" gerne anstelle einer inline-Funktion benutzt werden.
Viele C-Compiler kennen auch inline-Funktionen. Funktionen in C werden sogar automatisch "ge-inlined", wenn der Compiler dies für erforderlich hält. Außerdem sind Makros nichts schlechtes, wenn man mit ihnen umzugehen versteht. Jedes Teil einer Programmiersprache kann man korrekt gebrauchen oder mißbrauchen.
Shade Of Mine schrieb:
C mit Klassen ist eine Krankheit, denn das vereint die Nachteile von C und C++.
C++ ist C mit Klassen, wenn man von Feinheiten wie Function-Templates mal absieht. Konzepte wie RAII werden in C++ durch Klassen erst möglich.
Oder anders ausgedrückt: Ein C++ Programm ohne Klassen unterscheidet sich kaum von einem C-Programm.
-
veritySeeker schrieb:
C++ ist C mit Klassen, wenn man von Feinheiten wie Function-Templates mal absieht.
Genau, Feinheiten wie Templates, Exceptions, Namensräume, Funktions- und Operatorüberladung oder Referenzen, um ein paar zu nennen.
Natürlich sind Klassen ein sehr wichtiges Feature von C++ – aber bei Weitem nicht das einzige, das zu C hinzugefügt wurde. Ohne die restlichen neuen Features schöpft man nur einen kleinen Teil des Potenzials von C++ aus. Bibliotheken wie wxWidgets, die nur sehr eingeschränktes C++ verwenden, ist gut anzusehen, wie sowas herauskommt.