C/C++ Anfänger

#2996560
Lesenswert?

Gordon schrieb:
> Wenn Du objektorientiert programmieren lernen möchtest, dann würde ich
> C++ lernen und nicht mit C beginnen, sonst "denkst" Du laufend
> prozedural und programmiert auch so.

Ich würde genau das Gegenteil empfehlen ;-)
Wer richtig programmieren lernen will, der sollte prozedurale und 
objektorientierte Programmierung beherrschen (richtig verstehen was der 
Unterschied ist, entscheiden wann man besser prozedural, und wann man 
besser objektorientiert programmiert).

Möchte man einfach nur möglichst schnell zu Ergebnissen kommen, fängt 
man besser gleich mit C++ an. Aber ob man dann die Sprache auch wirklich 
verstanden hat, wage ich zu bezweifeln.

Ausserdem ist C++ ja quasi eine Erweiterung von C, daher liegt es 
irgendwie auch relativ nahe, dass man am besten mit den Basics, also C, 
beginnt. Beherrscht man C einigermassen (inkl. Pointern!), kann man auf 
C++ "upgraden" und noch die objektorientierte Programmierung lernen.

Praktisch alles, was man in C lernt, ist ja auch für C++ gültig, ist 
also keine verschwendete Zeit wenn man mit C beginnt und dann auf C++ 
wechselt.

Und zum Schluss dann noch z.B. Qt lernen für die grafische Oberfläche.
#2996621
Lesenswert?

Sven B. schrieb:
> Der Programmierstil unterscheidet sich schon enorm zwischen C und C++

Das ist so nicht korrekt.
1
int main(void){int a = 5; return 0;}
War das C oder C++? Siehst du, kann man nicht sagen, da es beides sein 
könnte ;-)

Erst durch die objektorientierte Programmierung entstehen wirkliche 
Unterschiede.

Ich bin aber der Meinung, dass es nicht schadet, wenn man beides 
(prozedural + objektorientiert) beherrscht. Es muss nicht sein, doch ich 
finde, wenn man mit C (prozedural) beginnt, lernt man die Sprache besser 
kennen, weil man eben zwei unterschiedliche Seiten der 
Programmiersprache kennen lernt. OOP/C++ ist auch nicht immer das Mass 
der Dinge (siehe z.B. AVR).

Es ist doch das selbe wie das Programmieren mit Notepad++ und Terminal, 
statt einer kompletten IDE. Ich habe früher auch direkt mit Delphi (OOP) 
angefangen. Ich konnte damit auch lauffähige Programme 
"zusammenbruzzeln". Doch verstanden habe ich das Zeug erst, als wir im 
Studium mit Notepad++ und Terminal begonnen haben.

Pointern bin ich immer aus dem Weg gegangen, weil ich sie nicht 
verstanden habe. Doch als wir im Studium Speicherabbilder usw. 
gezeichnet haben, ist mir das alles klar geworden. Immer mehr wurde mir 
sogar klar, dass das, was ich bisher zu Hause programmierte, eine totale 
"Sauerei" war.

Meine Programme liefen zwar immer, doch die Programmierung war jenseits 
von gut und böse.

Daher meine Empfehlung: Zuerst mit den absoluten Basics beginnen
- Notepad und Terminal bis Präprozessor, Compiler und Linker verstanden
- prozedurale Programmierung (in C) bis Pointer, Structs usw. verstanden
- Wenn das alles klar ist, mit OOP beginnen

Sven B. schrieb:
> C und C++ mit Qt sind meiner Meinung nach zwei völlig verschiedene Welten

C mit Qt machen mMn gar keinen Sinn. Mit Qt würde ich erst beginnen wenn 
man C++ (OOP) im Griff hat, und dann gleich Qt mit C++, nicht mit C.

Wie schon erwähnt: Man kann auch alles im Schnelldurchgang machen und 
gleich mit OOP und hübscher IDE beginnen, doch ob man dann das, was man 
tut, auch wirklich begriffen hat, ist dann eine andere Frage... ;-)
Ist halt die Frage, ob der TO möglichst schnell zu Ergebnissen kommen 
möchte, oder ob er die Programmiersprache verstanden haben möchte.
#2996715
Lesenswert?

Hi!

Urban B. schrieb:
> Sven B. schrieb:
>> Der Programmierstil unterscheidet sich schon enorm zwischen C und C++
>
> Das ist so nicht korrekt.
>
1
int main(void){int a = 5; return 0;}
> War das C oder C++? Siehst du, kann man nicht sagen, da es beides sein
> könnte ;-)
Nun, klar, das ist aber trivial, weil C eben großteils ein Subset von 
C++ ist ;)
Aber vergleiche mal den Code eines typischen C-Programms (git) mit dem 
eines typischen C++/Qt-Programms (keine Ahnung, kate) -- das ist echt 
völlig anders. [1]

> Ich bin aber der Meinung, dass es nicht schadet, wenn man beides
> (prozedural + objektorientiert) beherrscht.
Da stimme ich auf jeden Fall zu.

> Es muss nicht sein, doch ich
> finde, wenn man mit C (prozedural) beginnt, lernt man die Sprache besser
> kennen, weil man eben zwei unterschiedliche Seiten der
> Programmiersprache kennen lernt. OOP/C++ ist auch nicht immer das Mass
> der Dinge (siehe z.B. AVR).
Ja, schon, aber irgendwie habe ich den Verdacht, dass diese 
Herangehensweise einige Leute auch zu 
ich-erfinde-immer-das-Rad-neu-Programmierern macht...

> Es ist doch das selbe wie das Programmieren mit Notepad++ und Terminal,
> statt einer kompletten IDE. Ich habe früher auch direkt mit Delphi (OOP)
> angefangen. Ich konnte damit auch lauffähige Programme
> "zusammenbruzzeln". Doch verstanden habe ich das Zeug erst, als wir im
> Studium mit Notepad++ und Terminal begonnen haben.
Dass man eine IDE erst dann benutzen sollte, wenn einem klar ist, wie 
man den ganzen Kram, den die tut auch von Hand macht, ist klar. Das ist 
ja fast bei allem so, Tools mit Automatiken sind genau dann wirklich 
gut, wenn man den automatisierten Vorgang auch von Hand selber machen 
könnte.

> Immer mehr wurde mir
> sogar klar, dass das, was ich bisher zu Hause programmierte, eine totale
> "Sauerei" war.
Diese Erkenntnis habe ich seit zehn Jahren regelmäßig ungefähr einmal im 
Jahr. ;)
Ich denke, das gehört dazu beim programmieren.

> Sven B. schrieb:
>> C und C++ mit Qt sind meiner Meinung nach zwei völlig verschiedene Welten
>
> C mit Qt machen mMn gar keinen Sinn.
Ja, geht auch gar nicht, ich meinte <C> und <C++ mit Qt>.

> Wie schon erwähnt: Man kann auch alles im Schnelldurchgang machen und
> gleich mit OOP und hübscher IDE beginnen, doch ob man dann das, was man
> tut, auch wirklich begriffen hat, ist dann eine andere Frage... ;-)
> Ist halt die Frage, ob der TO möglichst schnell zu Ergebnissen kommen
> möchte, oder ob er die Programmiersprache verstanden haben möchte.
Oder man macht beides: Mit allem auf einmal anfangen, aber dann nach ein 
paar Wochen alles wieder beiseite legen und nochmal ganz von vorne 
beginnen. Das ist wahrscheinlich sogar die beste Methode.

Grüße,
Sven

_____
[1] Hört sich sogar deutlich unterschiedlich an, wenn man den Quellcode 
nach /dev/snd cat-et. ;)
#2996764
Lesenswert?

Sven B. schrieb:
> Dass man eine IDE erst dann benutzen sollte, wenn einem klar ist, wie
> man den ganzen Kram, den die tut auch von Hand macht, ist klar.

Als Anfänger ist einem das nicht so direkt klar, warum man sich mit 
solchem "Kinderkram" rumschlagen soll wenn es doch dafür eine IDE gibt 
(kann ich aus eigener Erfahrung sagen)^^

Sven B. schrieb:
> Ja, geht auch gar nicht, ich meinte <C> und <C++ mit Qt>.

Ach so, da habe ich dich falsch verstanden :-)

Jup, so gesehen gibt es natürlich grosse Unterschiede, mit <C++/Qt>-Code 
ist man ziemlich schnell mal überfordert wenn man so ein Projekt zum 
ersten mal anschaut :-)

Sven B. schrieb:
> Oder man macht beides: Mit allem auf einmal anfangen, aber dann nach ein
> paar Wochen alles wieder beiseite legen und nochmal ganz von vorne
> beginnen. Das ist wahrscheinlich sogar die beste Methode.

Ich vermute eher, man ist mit der Kombination C++/Qt ziemlich 
überfordert wenn man gleich damit beginnt. Da würde ich dann schon eher 
Schritt für Schritt vorgehen.

mfg
Gast #2996802
Lesenswert?

Der Unterschied zwischen prozeduraler und objektorientierte 
Programmierung liegt in der Kapselung welche die Übersicht und einfache 
Erweiterbarkeit verbessert.
Das ein C++ compiler C kann ist klar.
Beispiel:
1
//C-Code
2
static int var=0;
3

4
void setvar(int input)
5
{
6
 var = input;
7
}
8

9
int getvar()
10
{
11
 return var;
12
}
13

14
int main()
15
{
16
 setvar(99);
17
 printf(%d, getvar());
18
}
19

20
//C++ Code
21

22
class var
23
{
24
 private:
25
 int var=0;
26

27
 public:
28
 void setvar(int input)
29
 {
30
  var = input;
31
 }
32

33
 int getvar()
34
 {
35
  return var;
36
 }
37

38
 var(){}
39
 ~var(){}
40
}
41

42
int main()
43
{
44
 new var;
45
 var.setvar(99);
46
 cout << var.getvar();
47
 delete var;
48
}

Eine Klasse kapselt die Prozeduren und durch die Vererbung lassen sich 
bereits bestehende Klassen mit deren Prozeduren einfach weiterverwenden:
1
class morevar : public var
2
{
3
 private:
4
 int morevar;
5

6
 public:
7
 void setmorevar(int input)
8
 {
9
  morevar = input;
10
 }
11

12
 int getmorevar()
13
 {
14
  return morevar;
15
 }
16

17
 morevar(){}
18
 ~morevar(){}
19
}
20

21
int main()
22
{
23
 new morevar;
24
 morevar.setvar(99);
25
 cout << morevarvar.getvar();
26
 morevar.setmorevar(55);
27
 cout << morevarvar.getmorevar();
28
 delete morevar;
29
}

Das geht in C so nicht.
Gast #2996831
Lesenswert?

Ob C++ jetzt das beste ist Objektorientierung zu lernen ... zumindest 
für nen Anfänger glaube ich das nicht, da man sich da gleichzeitig mit 
den C-Besonderheiten UND OOP rumschlagen muss. Eine Sprache wie Python 
versteckt da einiges an grundlegendem Kram vor einem, den man auch 
irgendwann lernen sollte, aber dafür kann man sich intensiver mit OOP 
beschäftigen. (Python kann man durch jede höhere Programmiersprache mit 
OOP ersetzen, wobei es da auch durchaus Unterschiede in den 
Möglichkeiten und Konventionen gibt)
OOP "richtig" zu können ist nämlich auch so ne Sache... wobei vermutlich 
die meisten Leute da nicht ewig weit sind und das wohl auch garnicht 
nötig ist fürn Anfang.
Meine Empfehlung wäre daher: C oder C++, aber die Objektorientierung 
erst später wirklich vertiefen, oder dafür eine andere, höhere Sprache 
nehmen (Python. Meinetwegen Smalltalk, das ist sehr "pur" 
Objektorientiert, dafür nicht allzu verbreitet/praktisch anwendbar. ...)
Gibt auch Leute die sagen Funktionale Programmierung leitet einen viel 
besser zur Objektorientierung, aber für einen Anfänger ist das mMn ohne 
passende Betreuung nix.
Gast #2996847
Lesenswert?

adsf schrieb:
> Meine Empfehlung wäre daher: C oder C++, aber die Objektorientierung
> erst später wirklich vertiefen, oder dafür eine andere, höhere Sprache
> nehmen (Python. Meinetwegen Smalltalk, das ist sehr "pur"
> Objektorientiert, dafür nicht allzu verbreitet/praktisch anwendbar. ...)

Sehe ich nicht so, denn wenn man von Anfang an OOP betreibt ist das 
sinnvoller als erstmal Prozedural zu lernen um dann die Kaspelung neu 
erlernen zu müssen.
Man könnte auch gleich mit UML und dann in Kombination mit EIFFEL 
arbeiten, nur ist in der Praxis C++ Standard, da C ein Subset ist lernt 
man das auch gleich mit und von der Kapselung abzulassen ist einfacher 
als sie auf prozuderale Programmierung anzusetzen.
Meine Meinung.
#2996867
Lesenswert?

cppler schrieb:
> adsf schrieb:
>> Meine Empfehlung wäre daher: C oder C++, aber die Objektorientierung
>> erst später wirklich vertiefen, oder dafür eine andere, höhere Sprache
>> nehmen (Python. Meinetwegen Smalltalk, das ist sehr "pur"
>> Objektorientiert, dafür nicht allzu verbreitet/praktisch anwendbar. ...)
>
> Sehe ich nicht so, denn wenn man von Anfang an OOP betreibt ist das
> sinnvoller als erstmal Prozedural zu lernen um dann die Kaspelung neu
> erlernen zu müssen.

Ich seh das eigentlich auch so.
Die Leute, die objektorientiert anfangen wachsen auf natürliche Art und 
Weise in die für OOP notwendige Denkweise hinein. Leute die von der 
prozeduralen Welt kommen, haben deutlich Schwierigkeiten, ihre erlernte 
Herangehensweise über Bord zu werfen, während andersrum mit OOP 
aufgewachsene Leute kaum Schwierigkeiten haben, in die prozedurale 
Schiene einzusteigen. Ganz im Gegenteil gehen sie oft mit viel mehr 
Disziplin und weniger Schweinereien in die prozedurale Welt, weil ihnen 
das Konzept der Daten- UND Funktionskapselung in Fleisch und Blut über 
gegangen ist und sie eigentlich schnell den Dreh heraussen haben, wie 
man auch ohne Compilerunterstützung einige wesentliche Elemente und 
Prinzipien der OOP weiterhin benutzen kann.

Ich schlag mich daher auch auf die Seite: C++ mit einer guten Literatur, 
die einen durch die Materie führt.

Allerdings nur, wenn es um die Fragestellung 'C oder C++' geht.
Wenn die Fragestellung eigentlich lautet Windows Programme zu schreiben, 
dann würde ich (selbst wenn ich eine Abneigung dagegen habe) zu C# 
tendieren. Machen wir uns nix vor. GUI Programme auf Windows brauchen 
eine ordentliche Unterstützung, die zb C# liefern kann.
#2996929
Lesenswert?

Man kann auch mit C problemlos objektorientiert Programmieren, wie z.B. 
GTK und der Linux-Kernel beweisen.
1
int *var_new(void) {
2
        return (int*)malloc(sizeof(int));
3
}
4

5
void var_set(int *v, int i) {
6
        *v=i;
7
}
8

9
int var_get(int *v) {
10
        return *v;
11
}
12

13
int var_delete(int *v) {
14
        free(v);
15
}
16

17
int main(void) {
18
        int *z = var_new();
19
        var_set(z, 42);
20
        printf("%d", var_get(z));
21
        var_delete(v);
22
        return 0;
23
}

Ob man nun var_set(z, 42) oder z.set(42) schreibt ist auch nur ein 
kosmetischer Unterschied.
#2996954
Lesenswert?

Lukas K. schrieb:
> Man kann auch mit C problemlos objektorientiert Programmieren

natürlich kann man.
Genauso wie man mit C++ grauslichen Code produzieren kann.

Aber es macht einen Unterschied, ob ich mich für Selbstdiszipliin 
entscheide (die ich jederzeit über Bord werfen kann, selbst wenn ich es 
nicht merke), oder ob mir der Compiler auf die Finger klopft.

> Ob man nun var_set(z, 42) oder z.set(42) schreibt ist auch nur ein
> kosmetischer Unterschied.

Auch richtig.
Allerdings ist das auch nur der syntaktische Zucker den C++ mit sich 
bringt. OOP ist aber eine Philosophie, eine Denkweise, eine Art wie man 
Programmsysteme entwirft und aufzieht. Und die unterscheidet sich vom 
prozeduralen Ansatz. Hat mich selbst 2 Jahre gekostet, bis ich OOP 
verinnerlicht hatte und in letzter Konsequenz verstanden habe. Nach der 
ersten 1/2 Stunde C++ hatte ich auch das Gefühl, dass objektorientiertes 
Programmieren eigentlich sooo wild auch wieder nicht ist und das ich das 
schnell verstanden haben würde. Das bischen Syntax ..... Nun, gedauert 
hat es dann doch so um die 2 Jahre, bis ich es verinnerlicht hatte. Und 
da hatte ich schon 8 Jahre prozedurales Programmieren am Buckel.
Persönliche Seite #2997179
Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn die Fragestellung eigentlich lautet Windows Programme zu schreiben,
> dann würde ich (selbst wenn ich eine Abneigung dagegen habe) zu C#

Würde ich dem TE auch Empfehlen (oder Java) C++ und C sind auf dem PC 
aus heutiger Sicht genauso ein Krampf wie früher ASM vs C/C++ (bitte 
nicht hauen-> Überspitzte Formulierung!) gerade wenn der TE:

stone schrieb:
> bewege ich mich im html bereich und ich wollte
> einfach mal was neues versuchen

Wenn man sich dann etwas eingearbeitet hat und Merkt: Ich will doch 
Plattformunabhängig und "lowlevel" mit QT/C++ was machen steht ja einem 
Umstieg nix im Wege (außer das man sehr schnell all die kleinen 
Vereinfachungen vermisst welche einem C#/Java bietet...)
#2998252
Lesenswert?

Moment, hast du gerade "Qt" und "Low Level" in einem Satz gesagt?
Hast du mal geschaut, was die Qt-API so an Klassen hat?

http://doc.qt.digia.com/qt/qcalendarwidget.html
http://qt-project.org/doc/qt-4.8/qwebview.html
http://doc.qt.digia.com/qt/phonon-videoplayer.html

Wenn das für dich "Low-Level" ist, dann will ich nicht wissen, was "High 
Level" bedeutet? ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren