Forum: PC-Programmierung C und C++ gleichzeitig lernen?


von wulga (Gast)


Lesenswert?

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).

von Borislav B. (boris_b)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

... dann ist man schnell bei Qt und damit bei C++ :-)

von wulga (Gast)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

wulga schrieb:
> ich will ja
> auch GUI-Anwendungen machen (mit OpenGL) da komme ich an C++ ohnehin
> nicht vorbei.

OpenGL hat eine C API.

von Matthias (Gast)


Lesenswert?

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.

von wulga (Gast)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

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.

von db8fs (Gast)


Lesenswert?

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.

von Karlsson auf dem Dach (Gast)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

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).

von Lukas K. (carrotindustries)


Lesenswert?

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.

von wulga (Gast)


Lesenswert?

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

von Schiko (Gast)


Lesenswert?

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.

von Baku M. (baku)


Lesenswert?

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

von P. M. (o-o)


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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
von Oliver S. (oliverso)


Lesenswert?

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

von wulga (Gast)


Lesenswert?

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).

von D. I. (Gast)


Lesenswert?


von Dax (Gast)


Lesenswert?

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

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Eisenberg (Gast)


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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;

von Dax (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

... 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
Noch kein Account? Hier anmelden.