welche vorteile bietet c++ gegenüber c



  • 314159265358979 schrieb:

    Was für ein Schwachsinn. In C++ programmiert man komplett anders als in C, das Umlernen hat dann oft einen Misch-Stil zur Folge.

    Mit den entsprechenden Büchern hat es keinen Misch-Stil zur Folge und die Grundbausteine wie Schleifen und Funktionen braucht man auch in C++.

    Dein "Schwachsinn" ist übrigens schlechter Diskussionsstil, denn kannst du dir echt sparen.



  • Nur, um wenigstens ein Fünkchen von "Meta-Feedback" zu geben: Nichts von dem, was Du (c++ antworter) geschrieben hast, hat dazu geführt, dass sich mein Standpunkt bzgl C++ / bestem Lernansatz für C++ geändert hat. Das beruht offensichtlich auf Gegenseitigkeit :). Von mir aus gibt es dazu nichts mehr zu sagen.

    Gruß,
    kk



  • C++ antworter, es gibt in C so viele Sprachmittel und Techniken, welche in C++ durch bessere Alternativen abgelöst werden. Viele Leute verwenden diese bei einem Umstieg auf C++ aber weiterhin wegen der Kompatibilität. Wieso sollte man sich auf einmal alles abgewöhnen, wenn es weiterhin funktioniert? Genau hier liegt das Problem, welches man immer wieder schön im C++-Unterforum sieht und welches man beim Direkteinstieg zu C++ nicht hätte.

    Um ein paar Beispiele zu nennen (auch wenn es Leute gibt, welche die folgenden Punkte in C++ benutzen, kommt man generell gut ohne sie aus):

    • Variable Argument Lists
    • Makros für Funktionen und Konstanten
    • void*
    • Manuelle Speicherverwaltung mit malloc() und free()
    • Single-Entry, Single-Exit
    • Rohe Arrays
    • union
    • Zeichenkettenverarbeitung mit C-Strings
    • C-Casts
    • Prefixes als Namensraum
    • Globale Variablen

    Wenn man C lernen will, lernt man C, doch wenn man eh mit dem Hintergedanken anfängt, sich später C++ anzuschauen, ist man besser beraten, gleich damit anzufangen.



  • Hi,

    ich würde den umgekehrten Weg gehen, nämlich gleich C++ lernen mit einem guten C++-Buch, aber parallel dazu noch ein sehr gutes C-Buch (den Kernighan/Ritchie) lesen.
    Selbstverständlich wird man am Anfang Programme schreiben, die man zum größten Teil genau so gut dem C-Compiler anbieten könnte (schleifen, Verzeigungen...), aber man wird sich sicher nicht die Mühe machen noch alles mit Scanf einzulesen, und Felder von Feldern von Zeigern auf Zeiger... sollte man zwar auch verstehen aber möglichst heute nciht merh selber verwenden (es sei denne aus Effizienzgründen).

    Gruß Mümmel



  • Da haben wir wieder - wie so oft - eine unnötige Diskussion C versus C++. Programmieren ist keine Religion, wo man über die einzig richtige Lehre oder Dogmen streiten muss! Ich selbst habe mit C begonnen, weil es C++ noch nicht gab (davor FORTRAN, PL1, PASCAL, Assembler...). Ich scheue mich nicht, einige Dinge weiter in C zu machen. Schliesst sich doch nicht aus, der Compiler macht alles mit und das ist gut so! 🙂



  • Also ich selbst würde mich noch als Einsteiger bezeichnen was C/C++ angeht. Ich habe mit C angefangen und bin jetzt gerade dabei mir C++ mal etwas weiter anzueignen. Genau diesen Weg würde ich auch Neulingen empfehlen. Es ist sicher wahr dass sich mit C++ vieles eleganter als in C lösen lässt, aber mein Ziel war es nicht nur irgendeine Sprache zu lernen mit der ich dann schnell irgendetwas hinzaubern kann ohne zu verstehen was da eigentlich vor sich geht. Zudem glaube ich dass gerade das lernen der Punkte die Nexus an C so kritisiert für mein Verständnis sowohl der Sprache C als auch C++ und der Funktionsweise von Computern im allgemeinen von entscheidener Bedeutung waren. (Nur wer char arrays kennt lernt std::string & std::vector zu schätzen :D)

    Jetzt kann man natürlich argumentieren dass man sich diese Dinge beim C++ lernen doch auch gleich mit beibringen könnte, nur warum lernt man dann nicht erstmal C? Zudem kommt die, meiner Meinung nach, wesentlich steilere C-Lernkurve. C++ bietet so viele und umfangreiche Sprachkonzepte (Klassen, Mehrfachvererbung, Polymorphie, Templates, Überladungen, etc.) dass diese Sprache auf mich als völligen Neuling erstmal sehr erdrückend gewirkt hat. (Hier muss man anmerken dass ich noch Schüler bin und mir alles selbst beigebracht habe, wie das Ganze mit einem Lehrer aussieht weiß ich nicht.)
    Im Gegensatz dazu ist C vom Grundaufbau her eigentlich mehr als simpel. Es gibt nur ein paar Schlüsselwörter, Datentypen, Arrays, Funktionen, Pointer. Man musste also wirklich so gut wie nichts lernen, die Grundfunktionen konnte man ja immer schnell auf < http://www.cplusplus.com/reference/clibrary/ > nachschlagen. Man kommt einfach viel schneller dazu mal irgendetwas zu machen was über "Hello, World" hinausgeht ohne sich gleich ein "In C++ macht man sowas nicht mit xxx sondern mit virtueller Mehrfachvererbung"-Flame abzuholen.

    Und wenn man sich in C sehr sicher fühlt und gute Programme schreiben kann, macht das lernen von C++ doch auch gleich viel mehr Spaß. Das Grundzeugs kann man gleich überspringen, man freut sich über Klassen, Templates und die STL-Container anstatt sie zu verfluchen weil man nichts versteht. Zudem entsteht dass C/C++ Mischmasch meiner Meinung nach auch eher bei Leuten die gleich mit C++ anfangen vor, da diese ja meist C und C++ kaum unterscheiden können. Erst wer auch (mehr oder weniger) die C Konzepte verstanden hat kann diese mit C++ vergleichen und überlegen was jetzt wohl eleganter ist (wobei hier C zugegebenermaßen meistens ziemlich schlecht abschneidet.. ).

    Fazit:
    Erst C, dann C++ und nacher vielleicht noch etwas anderes hört sich doch gar nicht schlecht an 😉

    PS: Zu dem "in dieser/jener Sprache kann man ganz leicht GUIs erstellen".
    Wir arbeiten bei uns im Informatik Unterricht mit Python und letztens haben wir mit tkinter angefangen. Und dann hat mich doch wirklich jemand gefragt ob es nicht möglich wäre den gleichen Code öfter auszuführen, also quasi wieder nach oben zu springen. Als ich dann nach einer "Schleife" gefragt habe kamen nur fragende Blicke. Auf die Frage was denn wohl "window.mainloop()" bewirkt kam die Antwort "der Befehl startet das Fenster". Ich meine, mit C und WinAPI wäre sowas nicht passiert 😃



  • C++ antworter schrieb:

    Mit den entsprechenden Büchern hat es keinen Misch-Stil zur Folge und die Grundbausteine wie Schleifen und Funktionen braucht man auch in C++.

    Die hat C++ auch, ohne sich mit Funktionen rumzuschlagen, die man später (nach den Umstieg) nicht mehr braucht.



  • (Nur wer char arrays kennt lernt std::string & std::vector zu schätzen :D)

    Das glaubst du...
    Es gibt so viele ehemalige C Programmierer, die std::string nicht benutzen, weil sie mal gehört haben, dass es zu langsam ist und sich stattdessen ein eigene Stringklasse bauen.

    Zudem entsteht dass C/C++ Mischmasch meiner Meinung nach auch eher bei Leuten die gleich mit C++ anfangen vor, da diese ja meist C und C++ kaum unterscheiden können.

    Da du ja laut eigener Aussage selbst noch C++ Anfänger bist, lasse dich doch bei deiner Meinungsbildung von erfahrenen C++ Programmierern beeinflussen, die mehrheitlich der Meinung sind, dass ein C/C++ Mischmasch dann entsteht, wenn man vorher C Programmiert und es dann nicht schafft seine Denkweise umzustellen.

    Jemand, der mit einem guten C++ Buch lernt, wird sicherlich nicht anfangen alles prozedural mit void* und Co. zu lösen.

    Das Grundzeugs kann man gleich überspringen, man freut sich über Klassen, Templates und die STL-Container anstatt sie zu verfluchen weil man nichts versteht.

    Was muss man groß verstehen um die STL verwenden zu können? Ein Anfänger wird es wesentlich leichter haben mit std::vector.push_back() zu arbeiten, als sich in C mit malloc() und free() irgendetwas ähnliches nachzubauen.
    Er wird vielleicht nicht verstehen, wie das genau implementiert ist, aber das ist zum Verstehen der zugrundeliegenden Konzepte auch nicht wichtig.



  • Erst C, dann C++ und nacher vielleicht noch etwas anderes hört sich doch gar nicht schlecht an 😉

    Am besten auch mal über den OO-Tellerrand schauen und Haskell, Scheme, etc. lernen.



  • ZumHundertstenMal schrieb:

    Erst C, dann C++ und nacher vielleicht noch etwas anderes hört sich doch gar nicht schlecht an 😉

    Am besten auch mal über den OO-Tellerrand schauen und Haskell, Scheme, etc. lernen.

    Das klingt wie:

    ZHM schrieb:

    Am besten erst mal über den Wissenschafts-Tellerrand schauen und Astrologie, Alchemie, etc. lernen.

    Die einzige Aussage des Satzes bestand in der negativen Nebenbedeutung von "Tellerrand", das war aber nicht nett.



  • Das klingt wie:

    Unsinn, so klingt es absolut nicht.

    Zum einen habe ich "am besten auch" und nicht "am besten erst" geschrieben. Wenn das deinerseits nur ein Tippfehler war, betrachte diesen Punkt als inhaltslos.

    Zum anderen impliziere ich nicht, dass Haskell und Co. das einzig Wahre sind, so wie du es mit dem OO-Paradima machst, sondern ich sage nur, dass es auch Sinn macht auch mal etwas Funktionales kennenzulernen, nachdem man C++ und Co. kennengelernt hat.



  • ZumHundertstenMal schrieb:

    (Nur wer char arrays kennt lernt std::string & std::vector zu schätzen :D)

    Das glaubst du...
    Es gibt so viele ehemalige C Programmierer, die std::string nicht benutzen, weil sie mal gehört haben, dass es zu langsam ist und sich stattdessen ein eigene Stringklasse bauen.

    Das wäre aber schon ein ziemlich epischer fail 😃

    ZumHundertstenMal schrieb:

    Zudem entsteht dass C/C++ Mischmasch meiner Meinung nach auch eher bei Leuten die gleich mit C++ anfangen vor, da diese ja meist C und C++ kaum unterscheiden können.

    Da du ja laut eigener Aussage selbst noch C++ Anfänger bist, lasse dich doch bei deiner Meinungsbildung von erfahrenen C++ Programmierern beeinflussen, die mehrheitlich der Meinung sind, dass ein C/C++ Mischmasch dann entsteht, wenn man vorher C Programmiert und es dann nicht schafft seine Denkweise umzustellen.

    Jemand, der mit einem guten C++ Buch lernt, wird sicherlich nicht anfangen alles prozedural mit void* und Co. zu lösen.

    Ein bisschen in diesem Forum lesen reicht da schon.
    Und wer sich gut mit C versteht kennt dieses Forum!

    ZumHundertstenMal schrieb:

    Das Grundzeugs kann man gleich überspringen, man freut sich über Klassen, Templates und die STL-Container anstatt sie zu verfluchen weil man nichts versteht.

    Was muss man groß verstehen um die STL verwenden zu können? Ein Anfänger wird es wesentlich leichter haben mit std::vector.push_back() zu arbeiten, als sich in C mit malloc() und free() irgendetwas ähnliches nachzubauen.
    Er wird vielleicht nicht verstehen, wie das genau implementiert ist, aber das ist zum Verstehen der zugrundeliegenden Konzepte auch nicht wichtig.

    Falsch, ein Anfänger wird wohl mit char mystring[] = "foo bar" und nicht mit dynamischer Speicherwaltung anfangen. Und er wird bestimmt auch nicht Klassen in C einführen und dann std::string nachbauen.
    Ein Anfänger kennt wie gesagt weder Klassen noch Operatorüberladungen noch Templates und bekommt dann sowas vorgesetzt:

    #include <iostream>
    #include <vector>
    
    int main()
    {
      vector<int> foo; // <int> ??
      foo.push_back(42); // .push_back ?? 
      cout << "foo bar!" << endl; // << ??
    }
    


  • cooky451 schrieb:

    #include <iostream>
    #include <vector>
    
    int main()
    {
      vector<int> foo; // <int> ??
      foo.push_back(42); // .push_back ?? 
      cout << "foo bar!" << endl; // << ??
    }
    

    Ja und? Willst Du jetzt damit sagen, dass man einem Anfänger nicht vector und cout näher bringen kann, ohne Klassen und Templates zu erklären? Das funktioniert genauso gut, wie kleine Kinder ihre Muttersprache lernen, ohne, dass man ihnen erst die Grammatik erklären muss. Wenn es Dir so ein großes Rätsel ist, wie man C++ lernen kann, ohne sich anfangs mit Details aufzuhalten, dann schau Doch mal in das Buch "Accelerated C++" rein.



  • Falsch, ein Anfänger wird wohl mit char mystring[] = "foo bar" und nicht mit dynamischer Speicherwaltung anfangen.

    Falsch, ein Anfäger wird (bei einem entsprechenden Buch) mit std::string myString = "foo bar" anfangen und kann damit dann direkt ganz viele tolle Sachen machen, ohne verstehen zu müssen wie jetzt die Speicherverwaltung im Hintergrund aussieht.



  • welche vorteile bietet c++ gegenüber c?
    Ganz einfach, es kann alles von C und andere Paradigmen wie OOP obendrauf...





  • krümelkacker schrieb:

    cooky451 schrieb:

    #include <iostream>
    #include <vector>
    
    int main()
    {
      vector<int> foo; // <int> ??
      foo.push_back(42); // .push_back ?? 
      cout << "foo bar!" << endl; // << ??
    }
    

    Ja und? Willst Du jetzt damit sagen, dass man einem Anfänger nicht vector und cout näher bringen kann, ohne Klassen und Templates zu erklären? Das funktioniert genauso gut, wie kleine Kinder ihre Muttersprache lernen. Denen erklärst Du auch nicht erst wie die Grammatik funktioniert etc etc etc. Wenn es Dir so ein großes Rätsel ist, wie man C++ lernen kann, ohne sich anfangs mit Details aufzuhalten, dann schau Doch mal in das Buch "Accelerated C++" rein.

    Ich sage ja nicht dass das nicht geht. Nur, dass es leichter ist C zu lernen. Wenn ich mich hinsetze und eine Programmiersprache lerne möchte ich möglichst nachvollziebare Beispiele in denen ich alles verstehe. Und vor allem sollte es reproduzierbar sein. Aber cout << "foo" bringt mir als Anfänger gar nichts. Das steht so da und irgendwie passt es nicht ins Konzept. Als ich cout << "blah" lesen musste hatte ich immer das Gefühl irgendetwas verpasst zu haben. Dagegen printf ist einfach eine Funktion und was Funktionen sind lernt man sehr schnell ganz am Anfang.

    Und nein, ich glaube nicht dass das lernen einer Programmiersprache funktioniert wie das erlenen der Muttersprache. Man lernt die Syntax. Dinge wie if else while for switch muss man eben doch erklärt bekommen. Auch, wenn sich die Funktion meist aus dem Namen ergibt, muss die Syntax gelernt werden. (Wo setze ich Klammern, wann ==, !=, etc.)

    Man kann natürlich einem Anfänger vector und cout näher bringen ohne Klassen, Operatorüberladung und Templates zu erklären. Nur, welchen Sinn hat das? Der kann dann irgendwie etwas mit cout ausgeben und weiß auch dass vector wohl irgendwie sowas wie ein dynamisches array ist aber viel gewonnen hat man damit nicht. Man kann das gelernte nunmal nicht einfach auf andere Dinge anwenden, denn einem sind ja nur cout und vector bekannt. Mit Wissen über Arrays und Funktionen kann man irgendwie mehr anfangen.

    Falsch, ein Anfäger wird (bei einem entsprechenden Buch) mit std::string myString = "foo bar" anfangen und kann damit dann direkt ganz viele tolle Sachen machen, ohne verstehen zu müssen wie jetzt die Speicherverwaltung im Hintergrund aussieht.

    Ich glaube es wird einfach darauf hinauslaufen dass ich es ziemlich sinnlos finde Anfängern zu sagen nutzt mal std::string das ist voll toll und ihr könnt super viel damit machen ohne etwas davon verstehen zu müssen. Dann kann einem nämlich genau das passieren, was ich oben beschrieben habe. Schüler wissen zwar was eine while-Schleife ist, kennen die Syntax, aber können das gelernte einfach nicht anwenden.
    Man drückt Schülern doch auch keinen Taschenrechner in die Hand bevor sie rechnen können. Und dass der viel schneller/effizienter ist als nahezu jeder Mensch ist da doch auch kein wirkliches Argument oder?



  • cooky451 schrieb:

    Man drückt Schülern doch auch keinen Taschenrechner in die Hand bevor sie rechnen können.

    Nein, den drücken die besseren Schüler sich selber in die Hand. Alle, von denen ich weiß, daß sie vorzeitig Taschenrechner benutzt haben, sind nicht besonders schlecht in Mathe (mich eingeschlossen). Alle, von denen ich weiß, daß sie bis zur offiziellen Erlaubnis gewartet haben, sind schlecht in Mathe.
    Damit wäre zum einen gezeigt, daß die Lehrer nicht wissen, wie Kinder funktionieren, sondern in einer ganz seltsamen IchBinSchauUndKindIstDumm-Manier fehlbestimmen, wie Kinder lernen sollen. Und zum anderen ist Deine Argumentation auf dieses Muster zurückgeführt worden und zumindest ohne weitere Fußnoten recht fragwürdig.



  • cooky451 schrieb:

    ...Nur, welchen Sinn hat das?...

    *seufz*
    Das wurde doch alles schon x mal durchgekaut. goto seite 3.



  • Hm.. also bei uns gab es eigentlich nie eine offizielle Erlaubnis Taschenrechner benutzen zu dürfen..

    Und zum anderen ist Deine Argumentation auf dieses Muster zurückgeführt worden

    Muss ich momentan leider zugeben.
    Aber die Aussage bezog sich auch eher auf Grundschüler. Ich denke, wir sind uns einig dass man erst das "Rechnen"-Konzept verstehen sollte bevor man einen Taschenrechner nutzt. Und wenn man sich beim rechnen schon so langweilt dass man sich einfach selbst einen Taschenrechner besorgt, wurde das aber auch höchste Zeit.
    Ich möchte hier ja nicht die offensichtlichen Vorteile von C++ kleinreden. Aber dennoch halte ich es für sinnvoller elementare Datentypen, Arrays, Funktionen etc. bekannt zu machen bevor man mit std::string und std::vector anfängt. Und hier eignet sich der "C-Kontext" einfach besser, da dieser nunmal auf dem oben genannten basiert. Ich würde sogar behaupten dass das eher eine zusätzliche Schranke zwischen dem C-Stil und dem C++-Stil zieht.

    @krümel
    Auf Seite 3 sehe ich den Beitrag von C++ antworter. Auf Seite 4 dann die Erwiderung von Nexus und gleich darauf meinen ersten Beitrag hier. Ist immer noch die selbe Diskussion, ja, aber durchgekaut wurde das noch nicht 😃


Anmelden zum Antworten