C lernen oder C++ ?



  • KornChief schrieb:

    mein Kumpel möchte nun anfangen sich mit C-Sprachen zu beschäftigen. Da kommt auch meine Frage (damit er es nicht so durcheinander lernt wie ich), was zuerst?
    C : Nur Konsolenanwendungen oder ach GUI,Netzwerkprogrammeriung etc? Oder ist das zu "alt" und unbrauchbar?
    C++ : Oder eben gleich die Objektorientierte Variante?

    kommt drauf an, was ihr programmieren wollt. jede sprache ist für einiges besser und und für anderes nicht so gut geeignet. oft liegts noch nicht mal an der sprache selbst, sondern am umfeld, also welche tools, libraries und sonstige unterstützung es gibt, um einen themenbereich optimal zu beharken. ich würde mal sagen, du musst etwas konkreter werden, sonst kann man schlecht was empfehlen.
    btw, C ist gut für low-level sachen, hardwarenahe programmierung, treiber und so. C++ wird, soweit ich weiss, noch oft in der spieleentwicklung verwendet (obwohl auch da der trend mittlerweile mehr zu skriptsprachen geht, mit denen z.b. grafikengines gesteuert werden).
    🙂



  • Ich würde sagen C++ abstrahiert mehr. Du hast irgendwelche Klassen die irgendwas tolles machen ohne dass du weißt was eigentlich passiert. Das ist einerseits toll weil du viel schaffst bei wenig Aufwand. Andererseits ist es blöd wenn es nicht so funktioniert wie gewünscht und ein Debugging aufgrund der Komplexität unmöglich ist.

    Bei C hingegen ist man Herr der Lage, versteht zumindest die Syntax sofort und weiß im Allgemeinen immer genau was passiert. Dafür ist es halt auch aufwendiger komplexe Programme zu schreiben.

    Objektorientiert programmieren geht in beiden Sprachen das ist nicht das Kriterium und mit beiden Sprachen kannst du alles machen. Der eigentliche Unterschied sind Vererbung und Operatorüberladung, sehr mächtig aber auch kaum zu kontrollieren wenn man es übertreibt.
    Wahrscheinlich kannst du es darauf herunterbrechen ob du Vererbung und Operatorüberladung gut findest oder nicht.

    Man kann übrigens ganz nett mischen, C++ in Kombination mit C-Bibliotheken benutzen und sich von Vererbung und Operatorüberladung fern halten, aber trotzdem den syntaktischen Zucker mit Klassen haben. Bisher fahre ich damit ganz gut.



  • nwp2 schrieb:

    Man kann übrigens ganz nett mischen

    Jup. Ich halte viel davon, erstmal das klassische Programmieren zu lernen, Extremrekursion, Objektorientierung, Metaprogrammierung und so erstmal wegzulassen. Also im Prinzip klassisches C. Aber sofort cin und cout zu verwenden.



  • volkard schrieb:

    Aber sofort cin und cout zu verwenden.

    was aber doof ist, dann frisst kein C-compiler mehr deinen code. printf/scanf usw. gibts ja auch in C++.
    🙂



  • nwp2 schrieb:

    und sich von Vererbung und Operatorüberladung fern halten

    Vererbung ist bei 95% der Klassen auch gar nicht sinnvoll. Sie greift eigentlich nur bei GUI-Elementen und Simulationen von Zeug, das in der Außenwelt auch in einer Begriffshierarchie steht. Wenn man keine GUI-Libs baut und keine Simulationen, kommt man lange ohne aus. Operatorüberladung ist bei cin/cout recht praktisch (auch wenn ich es anders (schlanker) gemacht hätte) und wenn man Langzahlen oder Matrizen oder sowas reinmathematisches baut. Der Zucker bei den Klassen, daß man nicht mehr fwrite(datei,"abc",3), sondern datei.write("abc",3) schreibt, ist sehr lecker, ist eigentlich nur das Schubsen des Subjekts vor das Verb. Irgendwann gewöhnt man sich so schlimm dran, daß man nicht mehr "hol kind bier", sondern "kind hol bier" ruft.



  • Ich denke C++ -> C ist leichter als anders herum.
    Cler die C++ schreiben haben meist einen fürchterlichen Stil.



  • Icematix schrieb:

    Ich denke C++ -> C ist leichter als anders herum.

    was wird sich wohl ein C++ coder denken, wenn er in einem C-programm sieht:

    irgendwas = blah->blubb(7); // ?
    

    Icematix schrieb:

    Cler die C++ schreiben haben meist einen fürchterlichen Stil.

    ja, sie neigen zu vereinfachungen, machen immer gleich kurzen prozess, alles ganz direkt und so. pfui, das macht man doch nicht. *fg*
    🙂



  • KornChief schrieb:

    mein Kumpel möchte nun anfangen sich mit C-Sprachen zu beschäftigen

    Red ihm lieber ein, sich mit mächtigeren Sprachen zu befassen. Solche Dinge nimmt man nur zur Hand, wenn man sie wirklich braucht.
    🙂



  • Ich denke, wenn man zuerst C lernt, dann hat man zumindest die Basics in der Hand, um auf C++ wechseln zu können. Allerdings sollte man sich immer überlegen, was man eigentlich braucht. Objektorientierte Ansätze sind schön, da sie häufig auf etwas "Natürliches" übertragen werden können (und eigentlich der State of the Art in der Anwendungsprogrammierung sind). Allerdings würde ich wahrscheinlich einem Anfänger eher zu Java/C# raten, da diese Sprachen mit der sehr leichten Speicherverwaltung (also eigentlich keiner manuellen, bis auf wenige Ausnahme) am Leichtesten zu erlernen sind. Würde wahrscheinlich erst hinterher, wenns wirklich gebraucht wird oder interessiert auf C/C++ gehen, wenn ich mich erst ein wenig mit der Programmierung auskenne.



  • Vorden schrieb:

    Ich denke, wenn man zuerst C lernt, dann hat man zumindest die Basics in der Hand, um auf C++ wechseln zu können.

    wieso liest man eigentlich immer wechseln, umsteigen, usw? hindert einen doch keiner daran, mehrere sprachen zu lernen und auch zu benutzen. es ist ja nicht so, dass sich programmiersprachen gegenseitig überflüssig machen (bis auf wenige ausnahmen vielleicht).

    Vorden schrieb:

    Allerdings würde ich wahrscheinlich einem Anfänger eher zu Java/C# raten, da diese Sprachen mit der sehr leichten Speicherverwaltung (also eigentlich keiner manuellen, bis auf wenige Ausnahme) am Leichtesten zu erlernen sind.

    sehe ich auch so, aber der OP möchte ja C und/oder C++ machen. dazu hat er sich wohl schon entschieden.
    🙂



  • volkard schrieb:

    Vererbung ist bei 95% der Klassen auch gar nicht sinnvoll. Sie greift eigentlich nur bei GUI-Elementen und Simulationen von Zeug, das in der Außenwelt auch in einer Begriffshierarchie steht. Wenn man keine GUI-Libs baut und keine Simulationen, kommt man lange ohne aus.

    Ja, das stimmt. Mit C in Klassen kommt man sehr lange aus. Nur kommt dabei nichts Gutes heraus... :xmas2:



  • Wo muss man in C++ viel Speicher per Hand verwalten?
    STL und boost regeln.



  • Icematix schrieb:

    Wo muss man in C++ viel Speicher per Hand verwalten?

    du meinst wohl auch, new und delete (gleich beides in zweifacher ausführung, delete[] und new(), 'displacement new', oder wie das heisst), sind nur zum spass da, damit c++ programme schöner aussehen? *fg*
    🙂



  • ;fricky schrieb:

    du meinst wohl auch, new und delete (gleich beides in zweifacher ausführung, delete[] und new(), 'displacement new', oder wie das heisst), sind nur zum spass da, damit c++ programme schöner aussehen? *fg*
    🙂

    Jein, auch die zweite Zeile lesen. Um new kommt man nicht immer herum, gilt aber z.B. auch in Java (und dort gilt das sogar immer). Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.



  • ;fricky schrieb:

    Icematix schrieb:

    Wo muss man in C++ viel Speicher per Hand verwalten?

    du meinst wohl auch, new und delete (gleich beides in zweifacher ausführung, delete[] und new(), 'displacement new', oder wie das heisst), sind nur zum spass da, damit c++ programme schöner aussehen? *fg*
    🙂

    STL und boost regeln.



  • ;fricky schrieb:

    Icematix schrieb:

    Cler die C++ schreiben haben meist einen fürchterlichen Stil.

    ja, sie neigen zu vereinfachungen, machen immer gleich kurzen prozess, alles ganz direkt und so. pfui, das macht man doch nicht. *fg*
    🙂

    Nein, es geht nicht um Vereinfachungen, in manchen Fällen ist C eleganter in manchen C++. Und in C wird anders programmiert, als in C++ (Denkansatz ist anders), und nein, ich spiele dabei nicht auf OO an.

    Ich persönlich habe jedenfalls die Erfahrung gemacht, das jemand der von C kommt, in C++ selten das gleiche Programmierverständnis entwickelt, wie jemand der mit C++ angefangen hat (Selbst bei gleichlanger C++ Erfahrung). Dies mag vielleicht daran liegen, das man ungern gelerntes ignoriert, oder einfach weil man leichter in vorhandenen Bahnen denkt.

    Ich habe nichts gegen sauberen C-Code, ebenso wenig wie gegen sauberen C++ Code, aber das schlimmste ist für mich schlechter C++ Code von C-Entwicklern (Die mit aller Macht versuchen C zu programmieren, unter der Verwendung von C++ Schlüsselworten & Klassen).

    Zudem habe ich erlebt das ex-C-Entwickler gerne alles neu erfinden, selbst wenn es das ganze bereits in der C++ Bibliothek gibt (und letztere deutlich besser getestet ist). Und meinen, alles mit Performance erklären zu müssen, selbst wenn sich herausstellt das ihr Konstrukt um Klassen langsamer und schwerer zu warten ist. Gleichzeitig (das mag daran liegen, das in der Regel als Umsteiger älter sind) sperren sie sich gegen alles Neue in C++, selbst dann wenn es die Programmierung nachweislich verbessert (Ich verstehe dies nicht, also ist es schlecht).

    Wenn man mit einer Sprache anfängt, sollte man versuchen auch ihre Denkansätze zu verstehen. Selbst wenn dies im Gegensatz zu Paradigmen steht, die in einer vorher gelernten Sprache gelten. So wie ein C-Programmierer C++ nicht die C-Paradigmen aufzwingen sollte, sollte ein C++ Programmierer C nicht die C++ Paradigmen aufzwingen.

    cu André



  • Ich habe mit Java extrem schlechte Erfahrungen gemacht und würde jedem dringend davon abraten. Hauptsächlich weil die Fehlermeldungen so miserabel sind dass man kein Ahnung hat was man falsch gemacht haben könnte und man deshalb nach jeder Zeile kompilieren muss. Eigentlich kommt immer ein "In letzter Zeile ein } vergessen", was offensichtlich nicht der Fehler ist sodass man lustig den gesammten Quellcode nach Fehlern durchsuchen darf.

    Alternativ der Spaß mit if und else.

    if (i==3) return 42;
    else return 23;
    

    Das Ganze am Ende einer int-Funktion führt zu "error: int-Funktion ohne Returnwert". 😕 Es steht doch offensichtlich ein return da.
    Fein, wenn Java drauf besteht:

    if (i==3) return 42;
    else return 23;
    return 0;
    

    "error: unreachable statement" ....

    Natürlich kriegt man es irgendwann zusammengehackt sodass es sogar Java schluckt, aber der Aufwand um selbst die simpelsten Programme zu schreiben ist enorm.

    Java wird gern zu Lehrzwecken verwendet weil es objektorientierte Programmierung erzwingt. Ich halte es für Quatsch, erstens ist Objektorientierung nicht die Antwort auf alles, zweitens gehört mehr zu Objektorientierung als absolut alles in eine Klasse zu packen um davon ein Objekt zu erzeugen.

    Du könntest dir noch Python ansehen. Ist extrem leicht zu lernen, sehr leicht darin auch komplexe Programme zu schreiben weil Python praktisch alles für dich macht. Die Laufzeit ist nicht gerade toll, aber es ist meist eh egal ob das Programm in 0.001 oder 0.0001 Sekunden fertig ist. Die Fehlermeldungen sind sehr gut, da dich die mitgelieferte sofort funktionierende IDE im Falle eines Fehlers die Zeile und die genaue Stelle sagt wo der Fehler aufgetreten ist und eine sinnvolle Fehlermeldung ausgibt die ganz gut erklärt was du falsch gemacht hast.
    Aufgrund der Einfachheit von Python kannst du schlechten Spaghetticode schreiben und eine Weile kontrollieren, was sich aber irgendwann rächt.



  • Athar schrieb:

    Um new kommt man nicht immer herum, gilt aber z.B. auch in Java (und dort gilt das sogar immer).

    naja, Java hat doch 'nen GC, der sorgt dafür, dass sich programmierer in 99% der fälle keine gedanken um speichermanagement machen müssen. einfach 'new' aufrufen, benutzen und wieder vergessen. die chance, dabei etwas falsch zu machen, ist äusserst gering (aber nicht ausgeschlossen).

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet? du versteckst deine news, new()s, deletes und delete[]s hinter einer abstraktionsschicht, die der manuellen speicherverwaltung eine andere semantik überstülpt. letztendlich wird dadurch auch nichts besser, aussen hui und innen pfui.

    Blue-Tiger schrieb:

    STL und boost regeln.

    gleich zwei sätze von regeln, wahrscheinlich vertragen sich die noch nicht mal. *fg*

    asc schrieb:

    Zudem habe ich erlebt das ex-C-Entwickler gerne alles neu erfinden, selbst wenn es das ganze bereits in der C++ Bibliothek gibt ...

    dieses 'immer wieder alles neu machen' ist ein typisches anfängerproblem und ist eigentlich nicht programmiersprachenbezogen. ich schätze mal, einige leute trauen fertigen bibliotheken wohl nicht über'n weg und denken sich, wenn sie alles selber machen, haben sie mehr kontrolle über alles. oder sie empfinden es als abstrengend, sich in eine library einzuarbeiten und glauben, dass selbermachen einfacher ist. ich bin z.b. vom anderen extrem: ich benutze unglaublich viel fertiges zeug, bin fast sowas wie ein 'copy-und-paste programmierer'.
    🙂



  • nwp2 schrieb:

    Ich habe mit Java extrem schlechte Erfahrungen gemacht...
    Alternativ der Spaß mit if und else.

    if (i==3) return 42;
    else return 23;
    

    Das Ganze am Ende einer int-Funktion führt zu "error: int-Funktion ohne Returnwert". 😕 Es steht doch offensichtlich ein return da.

    kann nicht sein, du musst woanders einen fehler gemacht haben.

    int test (int i)
        {
            if (i==3) return 42;
            else return 23;
        }
    

    ^^geht ohne probleme.

    nwp2 schrieb:

    Fein, wenn Java drauf besteht:

    if (i==3) return 42;
    else return 23;
    return 0;
    

    "error: unreachable statement" ....

    stimmt, sowas lässt Java allerdings nicht durch.
    🙂



  • ;fricky schrieb:

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet?

    Dann verwendet man C++ schlecht. Mit Deiner Argumentation kann man auch zeigen, daß ein Lamborghini schlecht ist, weil man damit Probleme bekommt, wenn man kein Benzin benutzt.


Anmelden zum Antworten