Hallo zusammen, eine Frage zu C und C++, lohnt es sich eigentlich C und C++ gleichzeitig zu lernen oder besteht da die Gefahr Dinge zu verwechseln? Ich möchte C lernen um "Windows-Programmmierung" zu betreiben (zB nach dem Buch von Charles Petzold).
wulga schrieb: > Ich möchte C lernen um "Windows-Programmmierung" zu betreiben Herr, unseren täglichen Flamewar gib uns heute... C ist für Windows-Programmierung denkbar schlecht geeignet. Nimm lieber C# mit .NET (WPF oder WinForms) oder C++ mit Qt.
Wenn du sowieso C++ lernen willst, ist es am sinnvollsten C++ "normal" zu lernen, und dir danach anzuschauen was davon in C geht. Das ist dann ziemlich einfach. Anders herum ist eher schlecht, weil du dann erstmal alle schlechten C-Angewohnheiten wieder vergessen musst... Wenn du onehin C++ kannst brauchst du C eigentlich nicht mehr außer für obskure Plattformen für die es keinen C++ Compiler gibt. C Code lesen ist für C++ Könner auch kein Problem.
wulga schrieb:
> lohnt es sich eigentlich C und C++ gleichzeitig zu lernen
Ich würde mich erst einmal mit C beschäftigen und erst danach mit C++.
Neben der Gefahr Dinge durcheinander zu bringen, dürfte der Umfang von
C++ doch gewaltig sein.
C ist immer empfehlenswert und danach kannst Du ja C++ mal antesten.
Sollte es Dir nicht gefallen, wird Dir Dein durch C erworbenes Wissen
jedenfalls nicht schaden, auch mit einer anderen Programmiersprache
zurecht zu kommen.
Matthias schrieb: > Sollte es Dir nicht gefallen, wird Dir Dein durch C erworbenes Wissen > jedenfalls nicht schaden, auch mit einer anderen Programmiersprache > zurecht zu kommen. Eben doch. C bzw. viele C-Bücher bringen einem einen sehr prozeduralen, nicht-typsicheren, OOP-feindlichen Programmierstil bei. Den muss man erst einmal wieder un-lernen bevor man modernere Sprachen wie C++ lernt. Daher lieber nicht mit C anfangen. Matthias schrieb: > dürfte der Umfang von > C++ doch gewaltig sein. Man muss ja nicht sofort alles lernen. Wenn richtig beigebracht, kann man C++ zu Beginn leichter lernen.
wulga schrieb: > Ich möchte C > lernen um "Windows-Programmmierung" zu betreiben warum? win32 API geraffel ist von gestern und ein Zopf, den MS in den nächsten Versionen sicherlich abschneiden wird. Es macht imho mehr Sinn sich mit platform-abstrahierenden Frameworks auseinander zu setzen.
Dann muss ich mir mal anschauen was Qt ist, danke auf alle Fälle mal für den Hinweis. C kann ich im Nachhinein immer noch lernen, von dem her ist es sicher nicht schlimm wenn ich mich zuerst auf C++ konzentriere, ich will ja auch GUI-Anwendungen machen (mit OpenGL) da komme ich an C++ ohnehin nicht vorbei.
wulga schrieb: > ich will ja > auch GUI-Anwendungen machen (mit OpenGL) da komme ich an C++ ohnehin > nicht vorbei. OpenGL hat eine C API.
Sebastian V. O. schrieb: > OpenGL hat eine C API. Habe ich vergessen, ein nicht unwesentlicher Aspekt. Programmierer schrieb: >Eben doch. C bzw. viele C-Bücher bringen einem einen sehr prozeduralen, >nicht-typsicheren, OOP-feindlichen Programmierstil bei. Könnte aber auch ein Vorteil sein, da man sich tiefer mit der Materie und dem, was hinter der glitzernden GUI-Welt so stattfindet, auseinander setzen muss. Sicher, um Fenster und dergleichen zu erstellen gibt es besseres/einfacheres, aber da er sich auf den Petzold bezogen hat, der ja soweit ich weiß C genutzt hat, wird er sich schon etwas dabei gedacht haben. Anderenfalls hätte er vermutlich einen neueren Titel zu GUI-Programmierung gewählt.
Sebastian V. schrieb: > OpenGL hat eine C API Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten Beispiel Klassen genutzt.
wulga schrieb: > Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut > sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten > Beispiel Klassen genutzt. Weil der in den Beispielen erstellte Code C++ ist. Man könnte auch alles in C machen aber die Autoren des Buchs haben sich hier eben für C++ entschieden.
Im Endeffekt ist es doch vollkommen wumpe, wie man anfängt. C++ ist vom Design her darauf ausgelegt, verschiedene Programmierparadigmen zu unterstützen. Soll heißen, du kannst prozedural, objektorientiert und in begrenztem Maße sogar funktional programmieren und sogar auf statischer Typebene (also während des Compilevorgangs) imposante Dinge betreiben (http://blog.mattbierner.com/stupid-template-tricks-super-template-tetris/). Möchtest Du also C++ in jeder Facette beherrschen, gehen auf jeden Fall einige Jahre ins Land. Ohne Witz. Einfacher hast du es mit C, weil einfach der Sprachumfang viel niedriger ist. Solltest du objektorientierte Ansätze überhaupt noch nicht kennen - bitte nimm Java, C#, Objective-C oder Python um die Vorzüge von vollständig polymorphen Sprachen zu lernen. Sind diese Voraussetzungen allerdings erfüllt, so kannst Du mit guten OOP-Bibliotheken wie QT in C++ anfangen um dir von vornherein einen ordentlichen Stil anzugewöhnen - das ist gerade bei der breiten Palette an Paradigmen in C++ besonders schwierig einzuhalten, da immer die Versuchung da ist, mal diesen und mal jenen "Trick" anzuwenden. Als Einsteiger solltest du aber nicht unbedingt lernen, trickreich, sondern sauber zu programmieren. Da hilft QT extrem.
wulga schrieb: > Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut > sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten > Beispiel Klassen genutzt. Klar, OOP drängt sich in diesem Bereich geradezu auf. Das hat ja nichts damit zu tun, dass OpenGL eine C-API hat. Außen C++, innen u.a. Verwendung der OpenGL-C-API.
Ich bin übrigens mit C++ angefangen zu programmieren. Wobei ich das im Nachhinein eher als C mit ein wenig C++ bezeichnen würde. So habe ich z.B. die cout und cin Objekte benutzt um Text auf der Konsole auszugeben und einzulesen. Ansonsten habe ich auch eher wenig C++ Features genutzt und für Strings mit strcpy/strcat gearbeitet. Mit der Zeit sind dann immer mehr C++ Features dazu gekommen. Am Ende hat es dazu geführt, dass ich lange Zeit nicht wusste welche Features es in C nicht gibt (mittlerweile nachgeholt) und ich mir immer noch nicht die format specifiers von printf merken kann (den für int kriege ich gerade noch hin).
Man kann auch gut in C objektorientiert denken. Es müssen ja nicht alle APIs so seltsam geraten sein wie die Win32-API mit Funktionen wie CreateWindow(), MessageBox(), SystemParametersInfo() und so. Ganz schön geraten sind z.B. die APIs von cairo und 0mq. Objektorientiert ohne den ganzen Pattern-Wasserkopf, etc. Gtk+, hab' ich hier jetzt mal nicht genannt, die haben mit GObject durch grässlich viel Boilerplate OOP an C angeflanscht. Die API ist ganz bequem zu benutzten, nur eigene GObjects möchte ich nicht schreiben.
Danke für eure Hilfe. Ich denke ich beginne damit C++ gründlich zu lernen, dann GUI(FLTK für einfache Dinge, OpenGL für komplexe 3D-Anwendungen) und dann C, glaube das ist eine vernünftige Reihenfolge. Habe auch schon ein gutes Buch vom C++ Erfinder selbst, das hier ist es ISBN-13: 978-3868940053
Vlad T. schrieb: > win32 API geraffel ist von gestern und ein Zopf, den MS in den nächsten > Versionen sicherlich abschneiden wird. Falsch > Es macht imho mehr Sinn sich mit platform-abstrahierenden Frameworks > auseinander zu setzen. Richtig, macht dennoch Sinn.
wulga schrieb: > Danke für eure Hilfe. Ich denke ich beginne damit C++ gründlich zu > lernen, dann GUI(FLTK für einfache Dinge, OpenGL für komplexe > 3D-Anwendungen) und dann C, glaube das ist eine vernünftige Reihenfolge. > Habe auch schon ein gutes Buch vom C++ Erfinder selbst, das hier ist es > ISBN-13: 978-3868940053 So, jetzt auch noch mein Senf dazu (könnte länger werden): Zuerst mal möchte ich diesen Thread als solchen loben, weil er so schön sachlich blieb. Hat man ja nicht so oft hier... Ich möchte hier mal meinen Lieblingsspruch loswerden: "Programmiersprachen sind wie Frauen. Kennst du eine, kennst du alle. Nur im Geschmack sind sie unterschiedlich..." (freiwillig 5€ in die Chauvikasse) Meine persönliche Meinung (und eine andere wirst du von niemandem hören...) ist diese: Es kommt zunächst auch sehr darauf an, was man machen will. Den Plan, zuerst C++ zu lernen und danach C sehe ich als problematisch an. C ist -wie böse Zungen behaupten- ein besserer Macroassembler. Genau deswegen schreibe ich meine ATMega-Bastelprogramme in C, weil ich zwar auch ATMega-Assembler kann und auch schon viel damit gemacht habe, allein es kostet unendlich viel mehr Zeit, den ganzen ItziBitzi-Kram, den man immer wieder braucht, in Assembler zu programmieren. Auf so einem 'kleinem Eisen' braucht man trotzdem die Kontrolle über jeden Prozessortakt, und den hat man in C. Sobald die Probleme komplexer werden, braucht man mächtigere Werkzeuge, die einem die ganze Basisarbeit abnehmen (oder man bastelt es sich selber wie ehedem in C 'objektorientierte' Programmierung mit structs und Funktionspointern schon erfunden wurde) und in eine gefälligere und schneller zu schreibende Syntax fassen. Steigt man an diesem Punkt ein, ist es natürlich sehr leicht möglich, daß man Programme schreibt, die zwar funktionieren, aber man nicht mehr so genau weiß, wie, weil ein Großteil der Funktionalität von der Sprache oder gar von benutzten Libraries gekapselt wird. Von dort aus kann man sich das Leben noch einfacher machen, und Sprachen benutzen, in denen man noch nicht einmal die Datentypen genau kennen muß, die man verwendet. Ab da wird es dann auch dem Vollspacko möglich, Programme zu schreiben... BTDT, ich habe neulich ein bash-script geschrieben, das trigonometrische Funktionen verwendet. Das geht, und meine Kollegen von der Konsolenfront haben mir den goldenen Bash-Orden am Seitenband verliehen... Und dieser Stunt hätte in C ca. 50 mal mehr Codezeilen erfordert. Und hat nur deswegen das Erstaunen meine Konsolenkollegen erregt, weil sie das Programmieren nicht von der Pike auf gelernt haben. (bash als alternatives Mittel der Wahl, ich traue mich kaum, es 'Programmiersprache' zu nennen, kenne ich erst seit ca. 2 Jahren...) Um zum Thema zurück zu kommen: Wenn du C nach C++ lernen willst, dann wirst du ganz viele Dinge von C++ vermissen. Wenn du mit C anfängst, wirst du über viele Möglichekeiten von C++ erfreut sein... Am Ende ist es sowieso egal, Hauptsache man fängt irgendwo an. Und da sind C, C++ und Java gute Ansätze. Von Perl, Python, Javscript und PHP hätte ich dringend abgeraten, aber das werde ich nicht weiter begründen, weil das dann wirklich in einen Glaubenskrieg ausarten würde :-) Vor allem, weil ich in all diesen Sprachen auch schon größere Programme geschrieben habe. Und es mir sowas von überhaupt nicht gefallen hat... IdS! C oder C++ lernen! Meiner Meinung nach: Erst C, dann ++. Andersrum wird dich verwirren Meint Baku
Lukas K. schrieb: > Man kann auch gut in C objektorientiert denken. Die Frage ist eher, warum man das tun sollte, ausser als Notnagel. Die meisten OOP-Ideen sind nur aufwendig und fehleranfällig mit einer nicht-OOP-Sprache nachzubauen. Ich denke z.B. an (virtuelle) Vererbung, eines der absoluten Kernkonzepte der OOP. Und bei den absolut simpelsten Konzepten (Instanzen einer Klasse mit Members und Methoden, ohne Vererbung) kann man eigentlich noch nicht von OOP sprechen.
P. M. schrieb: > Lukas K. schrieb: >> Man kann auch gut in C objektorientiert denken. > > Die Frage ist eher, warum man das tun sollte, ausser als Notnagel. Weil es auch in C voneinander abhängige Datenstrukturen haben kann. Wenn ich daten von einem BMW und einem Lastwagen in structs speichere, erstelle ich zusätzlich ein struct Auto mit einem enum autoTyp als erster member, das struct Lastwagen und das strukt BMW bekommen dann den ersten member base mit type struct Auto. Wozu das gut ist? Dadurch muss ich funktionen für Autos nicht zweimal schreiben. > Die meisten OOP-Ideen sind nur aufwendig und fehleranfällig mit einer > nicht-OOP-Sprache nachzubauen. Erfahrungssache. Wenn man Functionspointer und normale Pointer, sowie die grundsätze des Speicherlayouts von structs und unions verstanden hat, ist es in c oft kein mehraufwand mehr. Über andere nicht-OOP als c kann ich jedoch nicht berichten. Zum lernen empfehle ich mit C99 oder C90 anzufangen. Dann von C90 zu C99 zu C11 zu C++99 zu C++11 zu C++14 Alle C featurs die nicht in C++ vorkommen: (ich schliesse hiermit gnu extensions explizit als teil von c/c++ aus) 1) Compound literale: (type){wert} 2) Designated initializers: struct type identifier={.member=value}; PS: Ich empfehle jedem beim compilieren einen c/c++ Standard anzugeben und die warnungen auf Maximum zu stellen. Ich verwende bei gcc immer die optionen -Wall -Wextra -Werror -pedantic -std=c11
:
Bearbeitet durch User
Daniel A. schrieb: > Zum lernen empfehle ich mit C99 oder C90 anzufangen. Dann von C90 zu C99 > zu C11 zu C++99 zu C++11 zu C++14 Nein. Genau das eben nicht. Objektorientiertes Programmieren sollte man direkt und von Anfang an lernen, und das geht nur mit C++. Oliver
Stroustrup meint selbst, dass man mit C++ beginnen soll, da es zu keinen guten Programmierstil führt mit C zu beginnen, es spricht dann aber auch nichts dagegen beides parallel zu lernen (außer der Verwechslungsgefahr).
db8fs schrieb: > (http://blog.mattbierner.com/stupid-template-tricks-super-template-tetris/). Ist das noch graue oder schon schwarze Magie :D
Ich hätte die gleiche Frage, ich kann bereits ganz passables Java; Und C habe ich ein Semester in der Uni gehabt. Also alles bis einschließlich Zeiger sitzt. (Zumindest wenn ich mich da mal für 2 Tage nochmal dran setzen würde) Die Frage ist: Mit C++ anfangen oder C Kenntnisse vertiefen? Ich möchte mit den Kenntnissen in die µC-Programmierung (AVR) einsteigen. Mit dem Arduino habe ich bereits herum experimentiert, jedoch besteht das Programmieren des Arduinos ja praktisch nur aus dem Finden der passenden Libery für ein Modul, paar if/while-Blöcken und dem Einsetzen von vorgefertigten Methoden. Da bleibt der große Lerneffekt aus. Außerdem lässt sich ein Arduino nicht so einfach irgendwo einbetten und wird auch in der Industrie nicht benutzt. Deswegen auch mein Interesse am AVR. Außerdem sollen noch Treiber programmiert werden um die AVRs mit dem PC (primär Windows) kommunizieren zulassen. (Zb. Einen Controller bauen und damit den PC fernsteuern) lg
Dax schrieb: > Mit C++ anfangen oder C Kenntnisse vertiefen? Nicht so einfach zu beantworten. Da du einen AVR programmieren möchtest würde ich dir eher zu C raten, da man viele praktische Sachen aus der Standardlibrary von C++ auf einem kleinen AVR nicht wirklich nutzen kann. Andererseits ist der Umfang von C nicht so groß und in der Uni Vorlesung hast du vermutlich jedes Feature wenigstens einmal kurz gesehen. Es gibt da also möglicherweise nicht mehr viel zu vertiefen was Features von C angeht (in das Programmieren von Algorithmen und gute Strukturierung von Programmen kann man sich dagegen sehr lange vertiefen). Es kommt also drauf an was dein Ziel ist. Wenn es das fertige Programm in kurzer Zeit ist, dann bleibt bei C. Wenn du mal was Neues ausprobieren möchtest und längere Entwicklungszeit OK ist, dann schau dir ruhig C++ an.
Dax schrieb: > Ich möchte mit den Kenntnissen in die µC-Programmierung (AVR) > einsteigen. C > Außerdem sollen noch Treiber programmiert werden um die AVRs mit dem PC > (primär Windows) kommunizieren zulassen. (Zb. Einen Controller bauen und > damit den PC fernsteuern) Meinst du wirklich Treiber oder "nur" Anwendungen, die über die üblichen Schnittstellen und APIs mit dem Controller kommunizieren? Neben den technischen Hürden würde bei Treibern nämlich u.a. die Zertifizierung auf dich zukommen, wenn du sie weitergeben willst. Mal ganz abgesehen von Sachen wie USB VID/PID.
Dax schrieb: > Und C habe ich ein Semester in der Uni gehabt Welches C? Veraltet: (vor c89/c90)
1 | int main(argc,argv) |
2 | int argc; |
3 | char** argv; |
4 | {}
|
c89/c90:
1 | /* comment */
|
2 | void x(char*x){ |
3 | int i,j; |
4 | for(i=0;;); |
c99:
1 | // comment
|
2 | void x(_Bool*restrict x){ |
3 | for(int i=0;;); |
4 | int j; |
c11:
1 | _Atomic int x; |
2 | int a = alignof(x); |
3 | thrd_t thread1; |
Vielen Dank für die Antworten Sebastian V. schrieb: > Andererseits ist der Umfang von C nicht so groß und in der Uni > Vorlesung hast du vermutlich jedes Feature wenigstens einmal kurz > gesehen Also das waren im groben die Themen: https://dl.dropboxusercontent.com/u/19641113/ThemenC.png Eisenberg schrieb: > Neben den > technischen Hürden würde bei Treibern nämlich u.a. die Zertifizierung > auf dich zukommen Mir geht es nur um den Privatgebrauch. Jedoch sollte es wirklich ein Treiber sein, sodass man sich praktisch eine USB-Tastaturerweiterung bauen und benutzen kann oder eben über eine Anwendung das Gerät steuern, wobei ein Treiber dazwischen sein soll und keine extra API. Daniel A. schrieb: > Welches C? c89/c90
wulga schrieb: > Hallo zusammen, > > eine Frage zu C und C++, lohnt es sich eigentlich C und C++ gleichzeitig > zu lernen oder besteht da die Gefahr Dinge zu verwechseln? Es ist immer besser, sowas nacheinander zu machen. Du lernst also zuerst das Laufen und dann später vielleicht mal das Autofahren. Und nich umgekehrt.
... und das spricht dann dafür, erst C und dann C++ zu lernen. Denn in diesem Fall ist Laufen ein wesentlicher Teil vom Autofahren, also ähnlich wie bei englischen oder italiensichen Modellen. C++ ohne Verständnis für C ist kein C++.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.