Bei C++ Grundlagenkenntnisse in C überflüssig?
-
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; } }
-
swapt, indem zuerst ints kopiert werden und der Rest in einzenen Bytes.

-
Dravere schrieb:
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üssliIch kann mir nicht vorstellen, daß man Schleifen von Java oder C# 1:1 übertragen und kompilieren kann.
Hingegen benutzt man die Schleifen und Funktionen, die man unter C benutzt, auch noch unter C++.
D.h. dann lernt man doch C und nicht C++ ?
-
redrew99 schrieb:
..
Genau, und wenn man Laufen lernt, lernt man Fußball und kein Basketball. Weiß doch jeder.

-
cooky451 schrieb:
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; } }Ja, aber haupsächlich, weil is und s total schlechte Namen sind. Wenn man es numberOfInts and remainingBytes nennen würde, wäre schon einiges klarer.
-
redrew99 schrieb:
Ich kann mir nicht vorstellen, daß man Schleifen von Java oder C# 1:1 übertragen und kompilieren kann.
Hingegen benutzt man die Schleifen und Funktionen, die man unter C benutzt, auch noch unter C++.
D.h. dann lernt man doch C und nicht C++ ?
Du schreibst jetzt über die Sprachen und ihre Eigenheiten. Ursprünglich ging es aber um Konzepte der Programmierung, also z.B. was ist ein Array und eine Liste. Das eine ist aber die Sprache, das andere die Theorie über Algorithmen.
Nehmen wir mal die for-Schleife: eine solche Schleife hat erstmal nichts mit einer Programmiersprache zu tun. Mit einer Schleife kann ich allgemein gesagt, wiederkehrende Aufgaben X-Mal (bestimmt durch eine Bedingung) ausführen. Ohne mir einen Wolf zu tippen.
Weil ich könnte anstatt einer Schleife auch die wiederkehrende Aufgabe X-Mal hintereinander in das Programm tippen oder Copy & Paste.Wo nützt mir diese Theorie? Nur in C und C++? Auch in BASIC (aus den 1950er Jahren!)? Eine Schleife kann ich sogar in Assembler programmieren.
Es ist also völlig egal, welche Sprache ich zu erst lerne. Die Sprache ist das Werkzeug mit der ich mein theoretisches Wissen umsetzen kann. In Assembler muß ich das etwas umständlicher machen (aber immer noch nachvollziehbar!). In BASIC, C und C++ kann ich das sehr komfortabel machen, weil diese Sprachen bereits eine spezialisierte for-Schleife anbieten.
Aber Listen, dynamische Arrays, for-Schleifen usw. sind aus der Theorie entstanden, und werden entweder direkt in die Sprache eingebaut oder ich kann sie mir aus den Sprachmitteln selber zusammen bauen.
D.h. also, ich brauche um C++ programmieren zu können, kein C-Vorwissen. Ich muß logisch und theoretisch denken können und lernen, wie ich das in der jeweiligen Sprache umsetzen kann.
Wenn ich eine verkettete Liste will, lerne ich erstmal, das es in C++ eine solche gibt. Wann ich diese nutze, anstatt eines Vectors, kann ich durch theoretisches Wissen und Logik entscheiden. Das kann ich aber ohne C. Da gibt es genug C++ Bücher, die einem das auch so erklären.
Und ich bin sogar der Meinung, das man vieles mit BASIC lernen kann. Ohne sich mit dem Werkzeug C oder C++ einen abkräpeln zu müssen. Weil die Theorie und Logik kann auch BASIC vermitteln. Es gibt auch sehr gute BASIC-Dialekte, die Spagethie Code vermeiden können (z.B. BBC BASIC oder COMAL).
-
Artchi schrieb:
Es gibt auch sehr gute BASIC-Dialekte, die Spagethie Code vermeiden können (z.B. BBC BASIC oder COMAL).
Ich glaube, Spaghetti-Code läßt sich mit jeder Programmiersprache produzieren oder vermeiden. Es ist immer eine Frage der Selbstdisziplin, ob man sein Programm plant und sinnvoll modularisiert, oder einfach wild draufloshackt.

Eigentlich gibt es keine "bessere" oder "schlechtere" Programmiersprache, sondern nur solche, die je nach Anwendungsfall besser oder weniger gut geeignet sind.
-
redrew99 schrieb:
Ich kann mir nicht vorstellen, daß man Schleifen von Java oder C# 1:1 übertragen und kompilieren kann.
Lass mich mal schnell sehen:
int sum = 0; for(int i = 0; i < 10; ++i) { sum += i; }int sum = 0; for(int i = 0; i < 10; ++i) { sum += i; }int sum = 0; for(int i = 0; i < 10; ++i) { sum += i; }Kompilert bei allen!
Weisst du, was dafür lustig ist? Unter C89 kompiliert es nicht! Und von C89 wurde C++ eigentlich abgespalten. In C89 müsstest du es so schreiben:
int i; int sum = 0; for(i = 0; i < 10; ++i) { sum += i; }Ansonsten: Siehe Beitrag von Artchi.
Grüssli
-
314159265358979 schrieb:
Der vector erlaubt es, aber nicht in O(1) sondern O(N). Die verkettete Liste in der STL heißt std::list.
Falsch. std::forward_list
-
Wrong Answer Noob schrieb:
314159265358979 schrieb:
Der vector erlaubt es, aber nicht in O(1) sondern O(N). Die verkettete Liste in der STL heißt std::list.
Falsch. std::forward_list
std::forward_list ist nicht Teil der STL.
-
Wrong Answer Noob schrieb:
314159265358979 schrieb:
Der vector erlaubt es, aber nicht in O(1) sondern O(N). Die verkettete Liste in der STL heißt std::list.
Falsch. std::forward_list
Beides sind verkettete Listen. std::list ist eine doppelt verkettete, std::forward_list eine einfach verkettete.