C auslassen, oder vor c++ lernen?



  • also, für größere software-projekte bietet sich c++, bzw allgemein eine object-orientierte sprache an.
    wenn du sowieso neu anfängst, wirst du wohl mit klassen noch nicht viel zu tun bekommen. allerdings sagt mir die erfahrung, dass sich große projekte damit sehr viel einfacher ordnen und gliedern lassen und die code-lesbarkeit "allgemein" besser ist (mal davon abgesehen, dass das auch eine frage des coding std's ist).

    zudem wirst du bei vielen software libs auf oo-designs stoßen. Qt ist zum beispiel ein beispiel dafür. opengl oder sdl, zeigen als gegenbesipeil auch, was man als reiner c-programmierer nicht hat. zb überladene funktionen, was ua. opengl und sdl sehr viel unübersichtlicher gestaltet.

    ich bin evtl. etwas voreingenommen, aber es ist doch wirklich so. bei größeren projekten hat man mit c oft zig tausend verschieden benannte funktionen, mit gering abgeänderten argumenten. und die einarbeitungszeit in solche bibs ist dementsprechend länger.

    die frage ob man jetzt c oder c++ lernt, sollte sich für den anfänger eigentlich nicht stellen. wenn du c++ kannst, wirst du auch mit c automatisch umgehen können. man lernt sowieso nie aus und die frage nach der effektivsten möglich zu programmieren stellt sich als anfänger auch nicht, aber es gibt nix, was du als c++ lernender auslassen würdest aber essentiell für die sprache c wäre. umgedreht ist es aber so!

    zudem wirst du auch größere probs haben wenn du mal in java programmierst oder python. eigentlich sind alle modernen sprachen objekt-orientiert. du kannst dich so besser in so ein konzept denken, als wenn du davon noch nie was gehört hast.

    TROLL abschnitt:
    ach ja, und meine meinung ist auch, dass c eine untermenge von c++ ist, weil c++ alle funktionen von c unterstützt umgekehrt aber nicht. (das ist auch die definition von untermenge)
    desweiteren denke ich auch, dass der linux kernel endlich in c++ geschrieben werden soll 🕶
    und ich denke auch das opengl 3 auch lieber auf c++ hätte umgestellt werden sollen, mit restloser streichung aller unnötigen alten funktionen, die kein schwein mehr braucht.




  • Administrator

    Wenn schon solche Links kommen, will ich auch noch einen hinwerfen:
    http://david.tribble.com/text/cdiffs.htm

    Grüssli



  • Ich denke mal, dass vielleicht ich als Anfänger in C++ was dazu sagen kann und darum will ich das mal tun. 🙂

    Wenn ich C++ Lektüre gelesen habe, dann hatte ich oft die Schwierigkeit, dass viele Themen mit "bekannt aus C" abgetan wurde. Da musste ich erstmal schauen was gemeint ist und wie es funktioniert. Das ist manchmal nervig.
    Das schwierigste sind Zeiger in C. Ich programmiere schon länger mit Java und ganz früher Pascal und kenne so etwas gar nicht. Das hat mir manchmal den letzten Nerv geraubt. Aber mittlerweile denke ich habe ich einen kleinen Einstieg in C++ gefunden. Und weil ich C++ (naja) kann ist C gar nicht mehr so schwer. So habe ich praktisch einen Einstieg in 2 Sprachen.
    Außerdem kann ich mir sehr gut vorstellen, dass wenn man mit C beginnt und dann zu C++ übersteigt, dass man dann mit der Objektorientierung ein paar Schwierigkeiten hat. Gerade weil man das aus C nicht gewohnt ist.

    Also darum bin ich dafür gleich mit C++ anzufangen und bei gelegentlichen Fragen und Interesse auf C zu schauen. Da hat man viel mehr von. 🙂



  • Neuling09 schrieb:

    Wenn ich C++ Lektüre gelesen habe, dann hatte ich oft die Schwierigkeit, dass viele Themen mit "bekannt aus C" abgetan wurde. Da musste ich erstmal schauen was gemeint ist und wie es funktioniert. Das ist manchmal nervig.

    Dann benutzt du aber Bücher die für Leute gedacht ist die C schon können.
    Ich persönlich habe kein Buch das so etwas sagt, höchstens informiert das dieses Sprachmittel aus C kommt.
    Und wenn der "Kritiker" schon was von der Homepage von Stroustrup verlinkt, kann er auch gleich dessen Meinung zu diesem Thema verlinken:

    Knowing C is a prerequisite for learning C++, right?
    Wrong. The common subset of C and C++ is easier to learn than C. There will be less type errors to catch manually (the C++ type system is stricter and more expressive), fewer tricks to learn (C++ allows you to express more things without circumlocution), and better libraries available. The best initial subset of C++ to learn is not "all of C".
    See Learning Standard C++ as a New Language for a discussion of the choice of C++ constructs, techniques, and libraries for early learning. For an example of books that takes that approach systematically, see Stroustrup: Programming: Principles and Practice using C++ and Koenig&Moo: "Accelerated C++" from Addison Wesley's C++ In Depth series.

    Quelle: http://www.research.att.com/~bs/bs_faq.html#prerequisite



  • Neuling09 schrieb:

    Ich denke mal, dass vielleicht ich als Anfänger in C++ was dazu sagen kann und darum will ich das mal tun. 🙂

    Wenn ich C++ Lektüre gelesen habe, dann hatte ich oft die Schwierigkeit, dass viele Themen mit "bekannt aus C" abgetan wurde. Da musste ich erstmal schauen was gemeint ist und wie es funktioniert. Das ist manchmal nervig.

    Dann hast du das falsche Buch gekauft. Bücher für Programmieranfänger sollten nicht voraussetzen, das man schon eine andere Sprache kennt. Wenn sie das tun, ist man kein Anfänger mehr.

    Es gibt genug C++-Bücher, wo der Autor selber noch in einer C-Welt lebt. Und dann ist das Buch schlecht.

    Es gibt Bücher die explizit C++ für C-Programmierer sind. Da ist es berechtigt.

    Es gibt Bücher, die sich C/C++ nennen. Da ist es normal das C vorkommt.

    In einem C++-Buch für Anfänger sollte aber nichts von C drin stehen bzw. keine Voraussetzung sein!

    Bücher wie der "C++ Primer" oder http://www.oop-mit-cpp.de erzählen nichts von C! Und die gehören auch mit zu den besten C++-Büchern.



  • Ich hab von Anfang an C++ gelernt. Ich wusste zwar dass theoretisch C in C++ enthalten ist, vor allem dass C++-Compiler C übersetzen können (zumindest fast, wenn man von den C99-Features mal absieht die in C++ enthalten sind), aber dennoch habe ich es nicht für nötig gehalten mich mit C zu beschäftigen.
    Man könnte denken dass wenn man C++ lernt, C direkt mit dabei ist. Dem ist aber nicht so, weil zu einer Sprache nicht nur die Syntax und die ethaltenen Schlüsselwörter usw. gehören, sondern auch die Semantik. Und die ist nunmal sehr unterschiedlich. Viele Dinge, die in C gang ung gäbe sind, könnte man von der Syntax her zwar in C++ machen, sie sind aber nicht üblich und meistens auch nicht sinnvoll, weil sie durch die zusätzlichen Paradigmen udn Mechanismen in C++ ersetzt worden sind. Wenn man sich C-Code anschaut, sieht man z.B. die wildesten Verrenkungen mit Pointern, es werden mit Pointern Argumente übergeben, hin- und hergecastet, arithemtische Operationen auf dynamischen Arrays betrieben usw. Sowas ist für einen C-Entwickler das tägliche Einmaleins, in C++ werden diese Mechanismen durch Objektorientierung, Polymorphie, Templates usw. ersetzt und deshalb sind sie für uns ungewohnt und sorgen hier und da für Kopfschmerzen.
    Eine Sprache zu lernen heißt vor allem, ihre Anwendung zu lernen. Und wenn man C++ lernen möchte dann braucht man sicher nicht in erster Instanz die Anwendung von Pointerspaghetti zu lernen sondern kann sich auf die Abstraktionen konzentrieren, die in C eher fremd sind (bzw. anders umgesetzt werden).

    Fang gleich mit C++ an, damit lernst du auch gleich alles an C was man für C++ braucht.



  • ich habe mich früher mit pointern auch ne weile schwer getan, und ein bekannter auch. der hatte meistens referenzen benutzt wos ging.

    aber zeiger sind nunmal einer der wichtigsten features der sprache um schnell auf große objekte zuzugreifen. darum sollte man den umgang mit ihnen schon lernen bevor man klassen schreibt oder stl benutzt.



  • dgrat schrieb:

    aber zeiger sind nunmal einer der wichtigsten features der sprache um schnell auf große objekte zuzugreifen. darum sollte man den umgang mit ihnen schon lernen bevor man klassen schreibt oder stl benutzt.

    Natürlich kommt man auch in C++ nicht um Zeiger herum. Jedoch kann man deren Anwendung in der Praxis auf ein Minimum beschränken, was oftmals zu schönerem, leicht wartbarem und weniger fehleranfälligem Code führt. In C++ steht einem im Gegensatz zu C diese Möglichkeit zur Abstraktion frei.



  • dgrat schrieb:

    ich habe mich früher mit pointern auch ne weile schwer getan, und ein bekannter auch. der hatte meistens referenzen benutzt wos ging.

    aber zeiger sind nunmal einer der wichtigsten features der sprache um schnell auf große objekte zuzugreifen. darum sollte man den umgang mit ihnen schon lernen bevor man klassen schreibt oder stl benutzt.

    Ähmmm, auch wenn Zeiger ihre Relevanz haben (Auch wenn ich nicht meine, das man sie zwangsweise vor Klassen oder der STL benötigt - es geht häufig gerade am Anfang auch ohne), ist das Argument "schnell auf große Objekte" nicht den Zeigern vorbehalten - das gilt auch für Referenzen.

    Und ja, ich nutze Referenzen wo es geht, aber Zeiger dort wo sie nötig und sinnvoll sind.

    Aber was bitte hat das mit "C auslassen, oder vor C++ lernen" zu tun. Es gibt Gemeinsamkeiten zwischen C und C++ die in beiden Sprachen Sinn machen, nur setzt man in C++ in der Regel nur einen Teil der C-Features ein, und teilweise auch auf eine andere Weise.



  • es schadet übrigens auch nicht, wenn man schon am Anfang, vor dem Lernen von C und C++, eine ungefähre Vorstellung von der Funktionsweise eines Mikroprozessors hat, und weiß, was indirekte Adressierung, Heap und Stack sind - das erleichtert das Verständnis von hardwarenahen Konzepten in C und C++, bspw. Zeiger und Arrays.

    just my EUR 0.02



  • u_ser-l schrieb:

    es schadet übrigens auch nicht, wenn man schon am Anfang, vor dem Lernen von C und C++, eine ungefähre Vorstellung von der Funktionsweise eines Mikroprozessors hat, und weiß, was indirekte Adressierung, Heap und Stack sind - das erleichtert das Verständnis von hardwarenahen Konzepten in C und C++, bspw. Zeiger und Arrays.

    Es ist ebenso vorteilhaft, wenn man schon Funktionen oder Objektorientierung aus einer anderen Sprache kennt. 😉

    Was aber nicht heisst, dass man sich deshalb speziell vorbereiten sollte, bevor man mit C++ anfängt.


  • Administrator

    u_ser-l schrieb:

    es schadet übrigens auch nicht, wenn man schon am Anfang, vor dem Lernen von C und C++, eine ungefähre Vorstellung von der Funktionsweise eines Mikroprozessors hat, und weiß, was indirekte Adressierung, Heap und Stack sind - das erleichtert das Verständnis von hardwarenahen Konzepten in C und C++, bspw. Zeiger und Arrays.

    Ehm, ich würde sagen, dass dem nicht so ist. Ich persönlich hatte keine Ahnung was Heap oder Stack ist oder wie ein Mikroprozessor funktioniert, wahrscheinlich hätte ich sogar Schwierigkeiten gehabt mir überhaupt vorzustellen was ein Mikroprozessor ist. Trotzdem, ich habe es gelernt und ich empfand es relativ leicht. Das war ziemlich schnell drin.

    Wieso ich dir allerdings widerspreche ist das folgende. Wenn du bereits eine Ahnung in dem Bereich hast, wirst du aus Faulheit anfangen das entsprechende Kapitel zu überfliegen. Dies ist gerade bei C++ nicht sehr vorteilhaft, da man wirklich genau wissen sollte, wie das Speichermanagement funktioniert.
    Ich denke es ist vorteilhafter wenn es in die andere Richtung geht. Zuerst C++ und dabei lernen was Speicherverwaltung heisst. Von da kann man dann auch weiter zum Mikroprozessor.

    Aber solche Dinge sind wohl auch sehr subjektiv.

    Grüssli



  • Wer mit C++ zu programmieren beginnt lernt zunächst einmal C oder sollte das jedenfalls tun. Ich glaube nicht, dass der sofortige Einstieg in OOP etc. sehr sinnvoll ist. Ältere Programmierer hatten es da einfacher: Es gab erst C. Als es dann C++ gab konnte man prüfen, was man mit den erweiterten Möglichkeiten machen konnte.
    Programmieren ist aber unabhängig von der Programmiersprache. Die Grundlagen, was man machen will oder machen muss, bleiben die gleichen.



  • berniebutt schrieb:

    Wer mit C++ zu programmieren beginnt lernt zunächst einmal C oder sollte das jedenfalls tun.

    Merkwürdig, irgendwie haben dir in dem Punkt schon fast alle widersprochen. Und C++ ist bitte auch nicht mit OOP gleichzusetzen (Davon abgesehen das C++ noch mehr Paradigmen über die prozedurale und objektorientierte Sprache bietet). Nur wird selbst die prozedurale Programmierung unter C++ in Teilen anders angegangen als in C (alleine schon weil man ein paar zusätzliche Schlüsselwörter und Bibliotheken hat, und auch ohne OOP Kenntnisse nichts verkehrt macht wenn man z.B. std::string verwendet).

    berniebutt schrieb:

    Ältere Programmierer hatten es da einfacher: Es gab erst C.

    Du meinst deutlich ältere Programmierer* (C++ ist 30 Jahre alt), und zudem sind gerade viele alte Programmierer Neuerungen gegenüber in etwa so, wie ein Pferd mit Scheuklappen. Du Programmierst deutlich anders unter C++ als unter C.

    * Ich sehe mich mit aktuell etwa 20 Jahren Programmiererfahrung, davon ca. die Hälfte in prozeduraler Programmierung, auch eher zu den Älteren. Nur lerne ich noch aktiv, und werde dies auch nicht aufhören solange ich es schaffe.

    berniebutt schrieb:

    Programmieren ist aber unabhängig von der Programmiersprache. Die Grundlagen, was man machen will oder machen muss, bleiben die gleichen.

    Gerade dann stelle ich mir die Frage: Warum C lernen wenn man C++ programmieren will. Gerade wenn deine Aussage stimmt (das tut sie IMHO nur zum Teil, da unterschiedliche Sprachen nicht immer in allen Paradigmen übereinstimmen), wäre deine erste Aussage (C vor C++) unnötig.



  • berniebutt schrieb:

    Programmieren ist aber unabhängig von der Programmiersprache. Die Grundlagen, was man machen will oder machen muss, bleiben die gleichen.

    Tja, ein Grund mehr nicht mit C anfangen zu müssen. Dann kann man ja gleich mit C++ anfangen, da die Sprache ja egal ist. 😉

    Im Ernst: C++ ist heute eine eigenständige Sprache. Warum leben so viele wie Du noch noch in einer "C with Classes"-Welt? Einfach unbegreiflich.
    Sagst du etwa auch einem Java-Einsteiger, das er erst C lernen muß, weil man als Java-Einsteiger auch gleich mit OOP konfrontiert wird? Viele empfehlen Anfängern gleich Java, Python oder C#. Alles OO-Sprachen, und keiner sagt, das diese schlecht für Anfänger sind.

    C++ ist eine Multiparadigmen-Sprache, gerade mit dieser lernt man nicht nur OOP sondern auch procedurales Programmieren. Dafür muß ich vorher nicht unnötig C lernen. Die Zeit die ich für C verbringe, kann ich sinnvoller in C++ investieren.



  • Dravere schrieb:

    Trotzdem, ich habe es gelernt und ich empfand es relativ leicht. Das war ziemlich schnell drin.

    Mir hat es dagegen beim Lernen von C geholfen, daß ich schon ein paar Assemblersprachen kannte,
    denn so war es kein Problem, sich unter einem Array die Anfangsadresse eins Speicherbereichs vorzustellen, auf den man mittels indirekter Adressierung zugreift - das ist ein Konzept, daß sich 1:1 auf Maschinensprache abbildet, ebenso wie Post- und Preinkrement (ja, die PDP 11) und einige andere Dinge.

    Ohne dieses Vorwissen ist doch beispielsweise schwer zu vermitteln, warum das 1. Element eines Arrays a[0] (und nicht a[1]) ist. Weiß man, daß a eine Adresse ist, macht es Sinn, weil a+0 == a.


  • Administrator

    u_ser-l schrieb:

    Ohne dieses Vorwissen ist doch beispielsweise schwer zu vermitteln, warum das 1. Element eines Arrays a[0] (und nicht a[1]) ist. Weiß man, daß a eine Adresse ist, macht es Sinn, weil a+0 == a.

    Und ein gutes Buch vermittelt dieses Wissen im voraus. Das Wissen ist ja wirklich einfache. Eine Adresse kann man extrem leicht und einfach erklären. Grundsätzlich reicht, wenn man jemandem sagt, dass die Adresse nichts anderes ist, als eine Zahl für jedes Byte.
    Nun kannst du genau das oben hinschreiben, mit dem a+0 == a . Ein gutes C++ Buch wird schliesslich erklären, was eine Adresse ist.
    Darum ging es mir ja auch, denn wenn man diese Konzepte schon kennt, wird man dann das Kapitel womöglich überfliegen und dann plötzlich gewisse andere Dinge nicht sehen, welche aber wichtig gewesen wären.

    Grüssli



  • es hat halt jeder andere Voraussetzungen und eine andere Mischung an Vorwissen, bei mir Assembler vor C. Dafür lernte ich OO mit C++, mit Smalltalk gingen mir dann die Augen auf.



  • Grundwissen zu Bits und Bytes gehört natürlich in jedes Programmierer-Anfänger-Buch. Selbst damals auf dem C64 wurde für BASIC-Anfänger erklärt was Speicheradressen sind. Und wenn ein C++-Buch kein C lehrt, heißt das nicht, das darin Bits & Bytes nicht erklärt gehören. In dem Buch http://www.oop-mit-cpp.de wird ausgiebig am Anfang dieses Thema behandelt, selbst wenn OOP auf dem Buchtitel steht.


Anmelden zum Antworten