Ich denke darüber nach, C zu lernen
Es gibt keinen bestimmten Grund, C nicht zu lernen, aber ich würde C ++ vorschlagen. Es bietet viel von dem, was C kann (da C ++ eine super Menge von C ist), mit einer großen Menge von "Extras". Das Erlernen von C vor C ++ ist nicht erforderlich - es handelt sich effektiv um separate Sprachen.
Anders ausgedrückt, wenn C eine Reihe von Holzbearbeitungswerkzeugen wäre, wäre es wahrscheinlich:
- Hammer
- Nägel
- Handsäge
- Handbohrmaschine
- Blockschleifer
- Meißel (vielleicht)
Mit diesen Tools können Sie alles erstellen - aber alles, was gut ist, erfordert möglicherweise viel Zeit und Können.
C ++ ist die Sammlung von Elektrowerkzeugen in Ihrem örtlichen Baumarkt.
Wenn Sie sich zunächst an die grundlegenden Sprachfunktionen halten, hat C ++ relativ wenig zusätzlichen Lernaufwand.
Aber warum verwenden die Leute C (oder C ++), wenn es "gefährlich" verwendet werden kann?
Weil manche Leute keine Möbel von IKEA wollen. =)
Im Ernst, obwohl viele Sprachen, die "höher" als C oder C ++ sind, Dinge haben, die sie (möglicherweise) in bestimmten Aspekten "einfacher" machen, ist dies nicht immer eine gute Sache. Wenn Ihnen die Art und Weise, wie etwas getan wird oder eine Funktion nicht bereitgestellt wird, nicht gefällt, können Sie wahrscheinlich nicht viel dagegen tun. Auf der anderen Seite bieten C und C ++ genügend "Low-Level" -Sprachenfunktionen (einschließlich Zeigern), mit denen Sie auf viele Dinge ziemlich direkt (insbesondere Hardware oder Betriebssystem) zugreifen oder sie selbst erstellen können, was in anderen möglicherweise nicht möglich ist Sprachen wie implementiert.
Insbesondere hat C die folgenden Funktionen, die es für viele Programmierer wünschenswert machen:
- Geschwindigkeit - Aufgrund der relativen Einfachheit und der Compileroptimierung im Laufe der Jahre ist es von Haus aus sehr schnell. Viele Leute haben auch viele Verknüpfungen zu bestimmten Zielen gefunden, wenn sie die Sprache verwenden, was sie möglicherweise noch schneller macht.
- Größe - Aus ähnlichen Gründen wie den für die Geschwindigkeit angegebenen können C-Programme sehr klein gemacht werden (sowohl in Bezug auf die ausführbare Größe als auch auf die Speichernutzung), was für Umgebungen mit begrenztem Speicher (dh eingebettet oder mobil) wünschenswert ist.
Kompatibilität - C gibt es schon lange und jeder hat Tools und Bibliotheken dafür. Die Sprache selbst ist auch nicht wählerisch - sie erwartet von einem Prozessor, dass er Anweisungen ausführt und Speicher, um Dinge zu speichern, und das ist alles.
Darüber hinaus gibt es ein so genanntes Application Binary Interface (ABI) . Kurz gesagt, es ist eine Möglichkeit für Programme, auf Maschinencodeebene zu kommunizieren, was Vorteile gegenüber einer Anwendungsprogrammierschnittstelle (Application Programming Interface, API) haben kann . Während andere Sprachen wie C ++ eine ABI haben können, sind diese normalerweise weniger einheitlich (vereinbart) als die von C, so dass C eine gute Basissprache ist, wenn Sie eine ABI verwenden möchten, um aus irgendeinem Grund mit einem anderen Programm zu kommunizieren.
Warum verwenden Programmierer nicht nur Java oder Python oder eine andere kompilierte Sprache wie Visual Basic?
Effizienz (und gelegentlich Speicherverwaltungsschemata, die ohne relativ direkten Speicherzugriff nicht implementiert werden können).
Der direkte Zugriff auf das Gedächtnis mit Zeigern bringt eine Menge netter (normalerweise schneller) Tricks mit sich, wenn Sie Ihre schmutzigen Pfoten direkt auf die kleinen Einsen und Nullen in Ihren Gedächtnisräumen setzen und nicht darauf warten müssen, dass der alte Lehrer das Spielzeug einfach austeilt zur spielzeit schaufeln sie sie dann wieder auf.
Kurz gesagt, das Hinzufügen von Dingen kann zu Verzögerungen führen oder auf andere Weise zu unerwünschter Komplexität.
In Bezug auf Skriptsprachen und Ähnliches müssen Sie hart arbeiten, um Sprachen zu erhalten, für die sekundäre Programme so effizient ausgeführt werden müssen wie C (oder eine kompilierte Sprache). Das Hinzufügen eines Interpreters im laufenden Betrieb bietet die Möglichkeit, die Ausführungsgeschwindigkeit zu verringern und den Speicherbedarf zu erhöhen, da Sie der Mischung ein anderes Programm hinzufügen. Die Effizienz Ihres Programms hängt ebenso stark von der Effizienz dieses sekundären Programms ab wie davon, wie gut (schlecht =) Sie Ihren ursprünglichen Programmcode geschrieben haben. Ganz zu schweigen davon, dass Ihr Programm oft vollständig darauf angewiesen ist, dass das zweite Programm überhaupt ausgeführt wird. Das zweite Programm existiert aus irgendeinem Grund nicht auf einem bestimmten System? Code no go.
In der Tat, die Einführung etwas „extra“ verlangsamt potenziell oder kompliziert Ihren Code. In Sprachen „ohne beängstigend Zeiger“, warten Sie immer für andere Teile des Codes hinter sich aufzuräumen oder auf andere Weise herausfinden „sicher“ Möglichkeiten , Dinge zu tun - weil Ihr Programm immer noch die gleichen Speicherzugriffsoperationen zu tun wie es mit getan werden Zeiger. Sie sind einfach nicht derjenige, der damit umgeht (Sie können es also nicht ficken, Genie = P).
Mit gefährlich meine ich mit Zeigern und ähnlichen Sachen. [...] Wie die Stack Overflow-Frage Warum ist die gets-Funktion so gefährlich, dass sie nicht verwendet werden sollte?
Nach der akzeptierten Antwort:
"Es blieb ein offizieller Teil der Sprache bis zur ISO-C-Norm von 1999, wurde jedoch von der Norm von 2011 offiziell entfernt. Die meisten C-Implementierungen unterstützen es immer noch, aber zumindest gibt gcc eine Warnung für jeden Code aus, der es verwendet."
Die Vorstellung, dass etwas in einer Sprache getan werden kann, muss es , ist dumm. Sprachen haben Fehler, die behoben werden. Aus Kompatibilitätsgründen mit älterem Code kann dieses Konstrukt weiterhin verwendet werden. Es gibt jedoch (wahrscheinlich) nichts, was einen Programmierer dazu zwingt, gets () zu verwenden, und tatsächlich wurde dieser Befehl im Wesentlichen durch sicherere Alternativen ersetzt.
Genauer gesagt ist das Problem mit gets () kein Zeigerproblem per se Zeigerproblem. Es ist ein Problem mit einem Befehl, der nicht unbedingt weiß, wie man Speicher sicher verwendet. In einem abstrakten Sinne sind dies alles Zeigerfragen - Lesen und Schreiben von Dingen, die Sie nicht sollten. Das ist kein Problem mit Zeigern; Es ist ein Problem mit der Zeiger-Implementierung.
Zur Verdeutlichung sind Zeiger erst dann gefährlich, wenn Sie versehentlich auf einen Speicherort zugreifen, den Sie nicht beabsichtigt haben. Und selbst dann ist nicht garantiert, dass Ihr Computer schmilzt oder explodiert. In den meisten Fällen funktioniert Ihr Programm nicht mehr (korrekt).
Da Zeiger den Zugriff auf Speicherorte ermöglichen und Daten und ausführbarer Code zusammen im Speicher vorhanden sind, besteht jedoch die Gefahr einer versehentlichen Beschädigung, dass Sie den Speicher ordnungsgemäß verwalten möchten.
Da Operationen mit direktem Speicherzugriff im Allgemeinen häufig weniger Vorteile bieten als noch vor Jahren, haben selbst Sprachen ohne Speicherbereinigung wie C ++ Funktionen wie intelligente Zeiger eingeführt , um die Lücke zwischen Speichereffizienz und Sicherheit zu schließen.
Zusammenfassend lässt sich sagen, dass es sehr wenig Grund gibt, den Zeiger zu fürchten, solange er sicher verwendet wird. Nehmen Sie einfach einen Hinweis von South Parks Version von Steve "The Crocodile Hunter" Irwin - stecken Sie Ihren Daumen nicht in die Irrenlöcher der Crocs .