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

7 Antworten

Naja, in wiefern es einfach ist, stellt sich natürlich die Frage. In der Praxis kann man jedoch sagen, C ist häufig (insbesondere im nicht objektorientierten Bereich) das Mittel zur Wahl. Also falsch machen kann man eigentlich wenig damit, es zu lernen. Von der Sprache ansich find ich ist C jetzt nicht unbedingt schwer. Klar gibt es einige Dinge die vielleicht etwas mehr Arbeit und Know-How erfordern als in anderen Programmiersprachen, wie beispielsweise Zeiger etc. Aber wenn es dir darum geht hinterher "professionell" programmieren zu können, ist es nicht verkehrt auch von solch "fortgeschritteneren" Themen, mit denen du in anderen Sprachen nicht konfrontiert wirst ein gewisses Verständnis zu haben. Einfach um die Hintergründe des ganzen zu verstehen. Insofern würde ich C durchaus als gute Sprache für Anfänger sehen, wenn man eine Lernquelle hat, die das ganze auch entsprechend gut erklärt. Python etc. ist auch sehr nett, allerdings gibt es dort einige Dinge nicht, die es in anderen Sprachen gibt und man kommt nicht so in dieses Unterscheiden von unterschiedlichen Datentypen rein, wie bei C oder Java oder so.


DanielPl  18.10.2015, 03:13

Und zum Thema schwer, glaub mir, ich war auch mal Anfänger. Das schwierige am Anfang ist meist (zumindest ging es mir so) nicht direkt die Sprache an sich, sondern in das "Denken" reinzukommen und die Dinge nachzuvollziehen. Wenn du ohnehin schon ein Buch hast, kann ich dir nur sagen, dann versuch dich dran und wenn du irgendwas nicht verstanden hast, auch wenn es blöd klingt, aber es schadet oft nicht, manche Dinge ein zweites oder drittes Mal zu lesen. Vielleicht lässt du es auch erst ein bisschen auf dich wirken, machst dir Gedanken dazu, probierst ein bisschen rum und liest dir das Thema dann nochmal durch. So waren mir dann Dinge, die ich anfangs überhaupt nicht verstanden habe oft letzten Endes doch klar. Nur so als Tipp, wenn sich irgendwo Verständnisschwierigkeiten einstellen sollten.

0
TessaPfi 
Fragesteller
 18.10.2015, 08:26

Danke. Gibt es eine Sprache, in der man erst mal die Grundsätze fürs Programmieren lernt? In dem Buch werden schon "Programmierwörter" benutzt, die nicht erklärt werden, und von denen ich keine Ahnung habe

0
DanielPl  19.10.2015, 14:34
@TessaPfi

Hmm, was genau meinst du mit "Programmierwörter" und "nicht erklärt". Es stimmt schon, gerade in C gibt es ein paar Sachen, wie zum Beispiel Präprozessordirektiven (bspw. #include <stdio.h>) mit denen ein Anfänger recht wenig anfangen, meist macht das aber auch kaum Sinn, das schon ganz am Anfang zu erklären, da jemand der wenig Ahnung hat sich darunter vielleicht wenig vorstellen kann. Zumindest hab ich das bei vielen bei mir im Studium beobachtet, haben im ersten Semester auch C gelernt und viele die noch nie zuvor Cod geschrieben haben, haben sich schon damit schwer getan. Aber in der Regel werden solche Dinge später erklärt, wenn man auch wirklich realistische Chancen hat sie zu verstehen und nicht gleich am Anfang. Aber auch sonst kann ich dir raten neben dem Buch wie gesagt noch die ein oder andere alternative Quelle zur Rate zu ziehen, möglicherweise irgendein Openbook im Internet oder irgendein Tutorial. Ein paar brauchbare gibt es da durchaus. Wichtig ist aber vor allem, dass du eine gute und genaue Erklärung hast. Gerade für C, das doch an einigen Ecken und Enden den ein oder anderen Fehler ermöglicht, wie zum Beipsiel Speicherlecks etc. (keine sorge, was das ist brauchst du noch lange nicht zu wissen). Möglicherweise würde ich dir, wenn du mit dem Buch tatsächlich nichts anfangen können solltest mal raten in ein anderes Buch reinzuschnuppern, eigentlich haben heutzutage die meisten größeren Buchhandlungen Bücher zum Thema Programmieren oder auch in einer Bibliothek, wenn du auf solche Möglichkeiten zurückgreifst, da es gerade für einen soliden Grundstein wichtig ist wirklich alle Grundlagen ordentlich zu beherrschen und verstanden zu haben.

0

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!


wyoxx  18.10.2015, 08:11

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
wolfgang1956  18.10.2015, 11:09
@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

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.

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.


W00dp3ckr  17.10.2015, 23:44

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
ceevee  17.10.2015, 23:54
@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
W00dp3ckr  18.10.2015, 00:25
@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
TeeTier  18.10.2015, 03:04
@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
martin7812  18.10.2015, 07:26
@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
ceevee  18.10.2015, 12:09
@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
Reyha24  18.10.2015, 12:40

martin7812: Wieso ist das ein Speicherleck?

1
martin7812  18.10.2015, 17:16
@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

Lass Dir nix einreden. C ist wichtig. C ist nützlich.

Und C ist eine gute Anfängersprache insofern als man eine saubere Unterscheidung zwischen Datentypen lernt, die man in Sprachen wie Python z.B. nicht so einfach lernt.