Ist C eine gute Programmiersprache für Anfänger?

8 Antworten

Ist C wirklich eine angemessene Programmiersprache für ABSOLUTE Anfänger?

Nein. C hat zwar einen recht geringen Sprachumfang, aber das macht es eher komplizierter. Mit C musst du dich unter anderem zwangsläufig immer auch darum kümmern, dass der Speicher aufgeräumt ist. Dinge, die bei anderen Sprachen Einzeiler sind, arten bei C schnell aus. Bei anderen Sprachen kannst du dich eher auf das, worauf es beim Programmieren ankommt - Algorithmen und Datenstrukturen - konzentrieren.

Bessere Einsteigersprachen wären mMn. Python, C# oder Delphi.

30

Ich bin mir da nicht so sicher. Es gibt viele Leute, die gerade bei den Anfängersprachen überhaupt nicht verstehen, was eigentlich abgeht, und irgendwie irgendwas hinfrickeln können, was zufällig läuft. Bei C wissen sie, was passiert, oder es geht nicht. Das macht es zumindest in dieser Hinsicht zu einer guten Anfängersprache.

1
42
@W00dp3ckr

Bei C wissen sie, was passiert, oder es geht nicht.

Schonmal in C Speicherlecks debuggt? Da kriegst du zur Laufzeit eine unverständliche Fehlermeldung und danach suchst du dir dann den Wolf. Und manchmal sind die Fehler nichtmal reproduzierbar. ;)

1
30
@ceevee

Been there, done that. Du schreibst Dir Dein Malloc und schon ist alles easy. Bis Du Speicherlecks debuggst hast Du schon einiges gelernt.

Jede Sprache hat ihre Stolpersteine an denen man sucht.

1
38
@ceevee

Also Speicherlecks sucht man doch nicht per Hand! Dafür gibt es auf jeder gängigen Plattform sehr gute Tools. Unter *ix z. B.:

gcc -O0 -g -o foo foo.c
valgrind --leak-check=yes ./foo

Dann bekommst du eine hübsche Auflistung an welchen Stellen deines Programms welche Form von Leck aufgetreten ist, inkl. Puffer-Überläufe, Null-Pointer-Dereferenzierungen, und und und ...

Ohne Leak-Checker, Fuzzer, Testsuite, Versionskontrolle und gefühlt weitere 100 Tools fange ich gar nicht mehr an zu programmieren. Und dabei ist eine IDE noch nicht mal mit inbegriffen ... ich bin eigentlich einer der Puristen, die mit vi und make arbeiten. :)

Aber wie W00dp3ckr schon geschrieben hat, macht man das als Anfänger sowieso nicht. Vermutlich benutzt man heutzutage CodeBlocks, DevCpp, Eclipse, oder eine ähnliche IDE, und eignet sich erst mal die Grundlagen an.

Und wenn man als Anfänger doch mal das Wort "Memory-Leak" zu Gehör bekommt, dann schreibt man sich einen Wrapper um malloc/free, um den nächsten Aha-Effekt zu erleben. :)

Gerade deshalb bevorzuge ich C als Anfängersprache ggü. Python, Java oder C#. :)

1
31
@ceevee

Speicherlecks

Ich arbeite seit fast 10 Jahren fast ausschließlich im Automobil-Steuergerätebereich, wo C die einzige verwendete Sprache ist. Ich habe 100te C-Programme in meinem Berufsleben gesehen.

Ich kann mich spontan nur an EIN EINZIGES im Automobilbereich erinnern, in dem dynamische Speicherverwaltung verwendet wurde!

In allen anderen wurde keine dynamische Speicherverwaltung benutzt und somit kann es auch keine Speicherlecks geben!

(Bei C-Programmen, aus anderen Bereichen (also nicht Automobil) sieht es allerdings oft anders aus.)

Schonmal in C Speicherlecks debuggt?

Eines meiner ersten Programme in meinem Berufsleben (damals nicht-Automobil-Bereich) war ein Programm zum Aufspüren von Speicherlecks.

Wie man so ein Programm für Java oder C# schreiben könnte, wüsste ich jetzt nicht...

Und ja: Speicherlecks kann man in jeder Programmiersprache erzeugen. Hier ein Beispiel in Java oder C#, das so tatsächlich in meiner Programmierpraxis (damals in Java) vorgekommen ist:

while(...)
{
MyClass1 obj1 = new MyClass1();
MyClass2 obj2 = new MyClass2();
obj1.ref2 = obj2;
obj2.ref1 = obj1;
...
}


0
42
@martin7812

Ui, hier gab's aber viel Feedback... auch wenn ich nach wie vor anderer Meinung bin (ich sehe Programmieren gerade für Anfänger erstmal etwas abstrakter - Algorithmen und Datenstrukturen statt Speicheraufräumen), so kann ich eure Ansichten doch nachvollziehen.

0
31

martin7812: Wieso ist das ein Speicherleck?

1
31
@Reyha24

Das ist recht einfach:

Im Gegensatz zu C (wo der Programmierer selbst daran denken muss, die Objekte "obj1" und "obj2" aus dem Speicher zu entfernen), kümmert sich bei Java oder C# der Garbage Collector darum.

Die Objekte im Beispiel referenzieren sich gegenseitig (für so etwas gibt es eine Menge Use-Cases).

Würde man folgende Zeile in den Code einbauen, würde alles funktionieren:

obj1.ref2 = null;

Das wird allerdings niemand machen. Man müsste diese Zeile dann einbauen, wenn man sich sicher ist, dass die Objekte "obj1" und "obj2" nicht mehr benutzt werden.

Der Garbage Collector kann "obj1" nicht freigeben, so lange "obj2" mit einer Referenz auf "obj1" existiert. Außerdem kann er "obj2" nicht freigeben, so lange "obj1" noch existiert.

Die Folge: "obj1" und "obj2" werden vom Garbage Collector niemals aus dem Speicher entfernt!

Das tragische daran: Ausgerechnet die Tatsache, das sich Java und C# von sich aus um den Speicher kümmern, führt dazu, dass unbenutze Objekte für immer im Speicher bleiben!

0

Ich finde, Deine Frage lässt sich auf viele Arten beantworten.

Wenn es Dir rein ums Programmieren geht, und Du schnuppern möchtest und Dir C zu hart ist, dann such Dir was Anderes, beispielsweise Python oder Scratch. Viele Unis fangen auch mit Scheme an, einem Lisp-Dialekt.

Wenn Du es mal weiter treiben willst, dann kann ich Dir versichern, dass alles was Du über C lernen kannst nützlich für Dich ist. Sonst verstehst Du nämlich gar nicht, was Python eigentlich macht. Im Innern. Unter der "Motorhaube". Python ist nämlich in C geschrieben. Alles was Python macht wird irgendwo auf ein C-Programm abgebildet.

Sind Russisch, Chinesisch, Hindi oder Italienisch schlechtere Sprachen als Deutsch? Es sind einfach die Muttersprachen der Einwohner der entsprechenden Länder. Das Gleiche gilt für Programmiersprachen. Ebenso wie du Englisch in den Schulen zwischen 5 … 9 Jahren lernst, solltest du auch den Zeitansatz bei Programmiersprachen sehen!

C bietet universell alle Möglichkeiten, die eine moderne Programmiersprache bieten sollte. Als „imperative“ Programmiersprache mag sie „modernen“ Programmierern altbacken erscheinen. Leider sind es häufig eher die Lehrbücher, die nach veralteten Konzepten lehren!

Auch „moderne“ objekt-orientierte Programmiersprachen verwenden noch immer imperative Konzepte. Abfragen auf Gleichheit, Ungleichheit oder Zuweisungen sind schließlich noch immer die gleichen imperativen Konzepte die von C stammen. Nur gehen Buchautoren auf diese Fragenstellungen nicht ein; sie wollen ja „ihr“ Buch verkaufen!

C ist m.e. die beste Programmiersprache, die man für den Einstieg lernen kann. C++, Java, Objective-C oder Swift sind einfach nur konzeptionelle Ergänzungen zur objekt-orientierten Programmierung. Wenn du aber das grundsätzliche Denken beim Programmieren gelernt hast, werden diese Ergänzungen sehr einfach!

17

Der Vergleich am Anfang ist echt schlecht... Was ist leichter zu lernen, Chinesisch oder was anderes? Das wird hier gefragt. Natürlich können die Muttersprachler eines Landes die Sprache. Die Frage ist, ob Ausländer Chinesisch leichter verstehen als z.B. Englisch, um es mal komplett auf dein "Beispiel" zu beziehen.

0
63
@wyoxx

Doch, der passt schon. Du siehst ihn nur in die verkehrte Richtung!

Sprachen dienen der Kommunikation und dem Gedankenaustausch. Dabei ist es egal, ob es eine gesprochene „Fremdsprache“ oder eine geschriebene „Programmiersprache“ ist. In beiden Fällen muß man als „Nicht-Muttersprachler“ die Sprache lernen!

0

Was möchtest Du wissen?