Bei C++ Grundlagenkenntnisse in C überflüssig?
-
cooky451 schrieb:
weil C++ mir anfangs zu kompliziert erschien.
Ist es nur, wenn man gleich von Anfang an mit allen Features auf einmal konfrontiert wird und ohne Struktur und roten Faden allein gelassen wird. Der Sprachumfang macht eine strukturierte Schritt-für-Schritt-Einführung notwendig, die nur wenige Bücher bieten.
Wenn man dich vor ein Gerät mit 50 verschiedenen Knöpfen stellt und nur sagt "mach mal" bist du auch verloren. Wenn man es dir erklärt und zu Beginn erstmal mit zwei oder drei Schaltern anfängt, weil man den Rest für die ersten Schritte noch nicht braucht, dann kann man das schrittweise erweitern.weil ich nie verstanden habe, was dieses komische << soll, warum das nur bei cout und cin auftaucht und wie man das sonst noch anwenden kann. Ich hatte irgendwie immer das Gefühl, etwas verpasst zu haben.
Das was du vermutlich verpasst hast war dann wohl das erste oder zweite Kapitel, in dem die wichtigsten Grundzüge von Ein/Ausgabeströmen in C++ erklärt wurden

-
pumuckl schrieb:
Das was du vermutlich verpasst hast war dann wohl das erste oder zweite Kapitel, in dem die wichtigsten Grundzüge von Ein/Ausgabeströmen in C++ erklärt wurden

Ich weiß es nicht mehr ganz genau (mein einziges C/C++ Buch (Ja, C/C++
) ist nicht so toll), allerdings hätte man mir vermutlich ganz am Anfang Operatorüberladungen erklären müssen.
Das ist aber wohl eine Eigenart von mir, ich hasse es einfach Dinge zu benutzen, die ich nicht zumindest im Ansatz durchblickt habe. Lustigerweise ist mir, soweit ich mich erinnern kann, die variable Parameterzahl von printf() erst so spät aufgefallen, dass ich dieses Mysterium nachschlagen konnte. Da hatte ich noch mal Glück, nachher hätte ich noch Pascal gelernt.
-
berniebutt schrieb:
Ein Bespiel wäre Pointer bei einem Character-String und ähnliches für C banales.
Deine Kenntnisse der C-Banalitäten haben interessanterweise dazu geführt, daß Du bei einem 200-Zeilen Programm 2 banale
Semikolons vergessen hattest. Der Source-Code war von Dir online gestellt verbunden mit dem Hinweis,daß das Programm nicht funktioniere (Algorithmus zum Berechnen von Schaltjahren war nach eigenen Angaben auch nicht richtig.) und konstruktive Kritik willkommen sei. Soviel mal zum Thema banale Fragen.berniebutt schrieb:
Braucht man C nicht mehr und warum fragen Einsteiger in C++ so oft 'wie soll ich dies oder jenes machen?' Es sollte mit der Denkweise von C++ doch alles viel einfacher zu lernen und anzuwenden sein!

Hm, da C++ und C gemeinsame Grundlagen haben, dürfte es unmöglich sein , C++ zu lernen, ohne auch C zu lernen.
Es gibt mit Sicherheit viele Sachen, wo C-Kenntnisse zu einem besseren Verständnis der Materie führen. So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
Geht man diesen Gedankengang weiter, könnte man auf die Idee kommen, warum eigentlich nicht erstmal Assembler lernen, bevor man C lernt. Das Verständnis z.B. eines Arrays ist mit Sicherheit besser, wenn man das erstmal in Assembler programmiert hat. Nicht zu vergessen die detaillierte Funktionsweise der Hardware.
Was also soll der Maßstab sein, um mit C oder C++ zu beginnen?
-
redrew99 schrieb:
So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren kann.
Das Argument hat mich vollends überzeugt.
-
redrew99 schrieb:
So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
vector ist ein Wrapper um einen dynamisch allozierten T[] und sonst nichts

-
Das stimmt natürlich, aber entscheidend in Bezug auf das Thema ist doch, daß man einen Container, der die Funktionalität eines Vektors besitzen soll, auch mit C programmieren könnte.
Hat man ja wohl früher auch, als es die STL noch nicht gab.
-
redrew99 schrieb:
Das stimmt natürlich, aber entscheidend in Bezug auf das Thema ist doch, daß man einen Container, der die Funktionalität eines Vektors besitzen soll, auch mit C programmieren könnte.
Du kannst jeden Container mit C nachbauen, nur halt nicht so hübsch mit Templates, Kapselung und Operatorüberladungen.

-
redrew99 schrieb:
Hm, da C++ und C gemeinsame Grundlagen haben, dürfte es unmöglich sein , C++ zu lernen, ohne auch C zu lernen.
Ich habe das unmögliche geschafft. Ich habe C++ gelernt ohne C zu lernen. Und das haben hier wohl auch andere geschafft

redrew99 schrieb:
Es gibt mit Sicherheit viele Sachen, wo C-Kenntnisse zu einem besseren Verständnis der Materie führen. So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
Geht man diesen Gedankengang weiter, könnte man auf die Idee kommen, warum eigentlich nicht erstmal Assembler lernen, bevor man C lernt. Das Verständnis z.B. eines Arrays ist mit Sicherheit besser, wenn man das erstmal in Assembler programmiert hat. Nicht zu vergessen die detaillierte Funktionsweise der Hardware.
Was also soll der Maßstab sein, um mit C oder C++ zu beginnen?
Die Frage ist, braucht man diese Kenntnis überhaupt? Muss man dies wirklich wissen, um einen std::vector zu verwenden? Man kann nämlich auch in die andere Richtung gehen. Muss ein Java-Entwickler wirklich Assembler lernen, nur damit er Java versteht? Du kannst es auch weniger extrem haben, muss ein Java Entwickler Bytecode verstehen? Gleiches gilt auch für C# Entwickler, muss der CIL, C++, C oder Assembler können, um in C# programmieren zu können?
Sicherlich ist es interessant und zusätzliches Wissen schadet nie. Aber es ist nicht notwendig. Man kann die Sachen auch ohne die genaue Kenntnis benutzen. Es reichen oft auch schon abstrahierte Bilder. Die genauen Details muss man nicht kennen. Das ist ja eigentlich auch die Idee von Sprachen auf einem höherem Level. Man will den Low-Level Kram wegkapseln, so dass man von ihm keine Kenntnis mehr haben muss. Genau dies geschieht auch schon in C++.
Grüssli
-
falsches Forum
-
redrew99 schrieb:
Das stimmt natürlich, aber entscheidend in Bezug auf das Thema ist doch, daß man einen Container, der die Funktionalität eines Vektors besitzen soll, auch mit C programmieren könnte.
Hat man ja wohl früher auch, als es die STL noch nicht gab.Von der Funktionalität her. Der C-Vector kommt aber vom Bedienkomfort her bei weitem nicht an den C++-Vector heran. Für die automatischen Konstruktoren und Destruktoren gibt es in C keinen Ersatz und die Templates gehen nur mit Gefrickel.
-
redrew99 schrieb:
Hm, da C++ und C gemeinsame Grundlagen haben, dürfte es unmöglich sein , C++ zu lernen, ohne auch C zu lernen.
Nö, ich habe C++ ohne C gelernt. Wenn ich heute Hardcore-C-Code sehe, kratze ich mich am Kopf und denke mir "Zum Glück hast du das nicht lernen müssen!".

redrew99 schrieb:
Es gibt mit Sicherheit viele Sachen, wo C-Kenntnisse zu einem besseren Verständnis der Materie führen. So z.B. bei einem "vector", der ja, wenn ich das richtig verstanden habe, vom Kern her nichts anderes ist als eine verkettete Liste auf der Basis eines C-Arrays, die man mit C-Grundkenntnissen auch selber programmieren könnte.
Nein, denn anscheinend hat dich das nicht weit gebracht, C zu können. Denn Vector besteht nicht aus einer verketteten Liste. Und um vector zu implementieren, hilft einem C überhaupt nicht weiter, weil ich vector mit new[] und delete[] implementieren müsste, worauf ein C-Programmierer ohne C++-Wissen nicht kommen würde. Ich brauche dafür absolut kein C-Wissen.
redrew99 schrieb:
Geht man diesen Gedankengang weiter, könnte man auf die Idee kommen, warum eigentlich nicht erstmal Assembler lernen, bevor man C lernt. Das Verständnis z.B. eines Arrays ist mit Sicherheit besser, wenn man das erstmal in Assembler programmiert hat. Nicht zu vergessen die detaillierte Funktionsweise der Hardware.
Hem, nicht unbedingt. Denn Assembler ist auch eine gewisse Abstraktion. Wenn man es weiter spinnen würde, müsste man reine Hexwerte... ach ne, ist ja auch nur ne Abstraktion von zusammen gefassten Bits.
Nein, also im Ernst: es schadet nicht, wenn man Assembler mal programmiert hat. Aber es hilft einem nicht weiter, weil man dadurch nur eine CPU-Architektur kennen lernt. Und wenn man Pech hat, noch dazu eine der mieserabelsten (x86). Also ich weiß nicht. Man bekommt dann vielleicht mit, das man Glücklich sein kann, C++ als Werkzeug zu haben. Ich habe damals 6510 und ARM2 Assembler programmiert. Aber ein Indexbasiertes Feld und wie ein Computer funktioniert, habe ich davor schon mittels BASIC und dessen PEEK und POKE gelernt. Und wie ich Daten im Speicher sequenziell ablege, habe ich davor schon mit dem DATA Befehl gelernt. Das ich mit Assembler besser wurde, um die Grundlagen zu kennen, kann ich deshalb nicht bestätigen. Es waren lediglich andere Sprachen und die ARM-Assembler-Sprache ist bis heute meiner Meinung nach die beste.
redrew99 schrieb:
Was also soll der Maßstab sein, um mit C oder C++ zu beginnen?
C und C++ halte ich generell nicht für gute Einstiegssprachen, weil man neben der Sprache noch viele andere Dinge lernen muß, z.B. der Umgang mit Headern, das Linken usw.
Ich halte immer noch eine Sprache wie BASIC (nein, nicht VisualBasic.NET, das hat meiner Meinung nicht mehr viel mit BASIC-Urgedanken gemeinsam), da sie Grundlagen der Programmierung beibringt, ohne das man sich viel mit Nebenkriegsschauplätzen auseinander setzen muß.
-
@Artchi: Noch abstrakter. Du würdest natürlich nicht new[], delete[] benutzen, sondern einen nutzerdefinierten Allocator mit Standardwert std::allocator<T>.

-
-
Artchi schrieb:
weil ich vector mit new[] und delete[] implementieren müsste, worauf ein C-Programmierer ohne C++-Wissen nicht kommen würde. Ich brauche dafür absolut kein C-Wissen.
Ok, das wußte ich nicht. Dachte, daß new[] und delete[] Relikte aus C sind.
Aber solche Sachen wie Schleifen oder Funktionen z.B. sind doch eigentlich C oder?
-
redrew99 schrieb:
Ja, in vielen Fällen braucht man es vermutlich nicht.Auf der anderen Seite - z.B. habe ich mir mal den Code einer verketteten Liste angeschaut, um zumindest ansatzweise zu verstehen, wie ein c-vector funktioniert.
Nochmal, da du es nicht mitbekommen zu haben scheinst: Vector ist keine verkettete Liste! In keiner Implementierung! Vector ist ein netter Bedienkomfortwrapper um ein dynamisches Array. Wenn man die ganzen Memberfunktionen (und zusätzlichen Templateparameter) mal außen vor lässt, wird das nicht viel mehr sein als
template<class T> class vector { T* begin_data, end_data, end_allocated; };Und fertig. Aus technischen Gründen werden die Verwaltungsdaten noch in einer Unterklasse stehen, aber von der Funktionalität her war's dies schon.
-
Nochmal, da du es nicht mitbekommen zu haben scheinst: Vector ist keine verkettete Liste! In keiner Implementierung! Vector ist ein netter Bedienkomfortwrapper um ein dynamisches Array. Wenn man die ganzen Memberfunktionen (und zusätzlichen Templateparameter) mal außen vor lässt, wird das nicht viel mehr sein als
Ok.
-
Der vector erlaubt es, aber nicht in O(1) sondern O(N). Die verkettete Liste in der STL heißt std::list.
-
cooky451 schrieb:
Ich als verkappter C-ler finde C++-"Profis" die nur wenig C können jedenfalls immer wieder lustig.

Aber deren Existenz beweist nun mal auch, dass man C für C++ nur unvollständig können muss.Was können C-ler was C++-ler nicht können? Ich hab zwar nur ganz wenig C programmiert, aber mir fällt jetzt nichts ein was da besonders war.
-
redrew99 schrieb:
Aber solche Sachen wie Schleifen oder Funktionen z.B. sind doch eigentlich C oder?
Sind für dich Schleifen oder Funktionen in Java oder C# ebenfalls C? Nur weil die Schlüsselwörter gleich heissen und das gleiche ausgeführt wird, ist dies doch nicht automatisch C! Wie kommt man auf so eine Idee?
Grüssli
-
oberunter schrieb:
Was können C-ler was C++-ler nicht können? Ich hab zwar nur ganz wenig C programmiert, aber mir fällt jetzt nichts ein was da besonders war.
Da musst du jetzt die Leute fragen, die von sich behaupten gut C++ aber nur schlecht C zu können. Man könnte es ja gleich mal mit etwas Einfachem probieren.. findet irgendjemand hier so etwas schwer zu lesen?
static void swap(void* a, void* b, size_t size) { size_t is = size / sizeof(int); size_t s = size - is * sizeof(int); while (is--) { int buf = *((int*)(a) + is); *((int*)(a) + is) = *((int*)(b) + is); *((int*)(b) + is) = buf; } while (s--) { char buf = *((char*)(a) + s); *((char*)(a) + s) = *((char*)(b) + s); *((char*)(b) + s) = buf; } }