C Language Tutorial
Erste Schritte mit C Language
Suche…
Bemerkungen
C ist eine universelle, zwingende Computerprogrammiersprache, die strukturierte Programmierung, den Umfang lexikalischer Variablen und Rekursion unterstützt, während ein statisches Typensystem viele unbeabsichtigten Operationen verhindert. Konstruktionsbedingt stellt C Konstrukte bereit, die typische Maschinenbefehle effizient abbilden, und hat daher in Anwendungen, die zuvor in Assemblersprache codiert wurden, einschließlich Betriebssystemen sowie verschiedener Anwendungssoftware für Computer, die von Supercomputern bis zu eingebetteten Systemen reichen, eine dauerhafte Verwendung gefunden .
Trotz ihrer geringen Fähigkeiten wurde die Sprache so konzipiert, dass sie die plattformübergreifende Programmierung fördert. Ein standardkonformes und portabel geschriebenes C-Programm kann für eine Vielzahl von Computerplattformen und Betriebssystemen mit wenigen Änderungen des Quellcodes erstellt werden. Die Sprache ist auf einer breiten Palette von Plattformen verfügbar, von eingebetteten Mikrocontrollern bis zu Supercomputern.
C wurde ursprünglich von Dennis Ritchie zwischen 1969 und 1973 in Bell Labs entwickelt und zur Neuinstallation der Unix- Betriebssysteme verwendet. Es ist seitdem zu einer der am weitesten verbreiteten Programmiersprachen aller Zeiten geworden, wobei C-Compiler verschiedener Hersteller für die Mehrzahl der vorhandenen Computerarchitekturen und Betriebssysteme verfügbar sind.
Gemeinsame Compiler
Der Prozess zum Kompilieren eines C-Programms unterscheidet sich zwischen Compilern und Betriebssystemen. Die meisten Betriebssysteme werden ohne Compiler ausgeliefert, daher müssen Sie einen installieren. Einige gängige Compiler-Optionen sind:
- GCC, die GNU Compiler Collection
- clang: ein Frontend für die C-Sprachfamilie für LLVM
- MSVC, Microsoft Visual C / C ++ - Erstellungstools
Die folgenden Dokumente sollten einen guten Überblick darüber geben, wie Sie einige der häufigsten Compiler verwenden können:
Compiler C-Version Unterstützung
Beachten Sie, dass Compiler unterschiedliche Standards für den Standard C haben, wobei C99 nach wie vor nicht vollständig unterstützt wird. Zum Beispiel unterstützt MSVC seit dem Release 2015 viel von C99, hat jedoch noch einige wichtige Ausnahmen für die Unterstützung der Sprache selbst (z. B. scheint die Vorverarbeitung nicht konform zu sein) und für die C-Bibliothek (z. B. <tgmath.h>
) dokumentieren sie notwendigerweise ihre "implementierungsabhängigen Entscheidungen". Wikipedia hat eine Tabelle mit Unterstützung einiger populärer Compiler.
Einige Compiler (insbesondere GCC) haben Compiler-Erweiterungen angeboten oder bieten diese weiterhin an, die zusätzliche Funktionen implementieren, die die Compiler-Hersteller für notwendig erachten, hilfreich oder für wahrscheinlich in einer zukünftigen C-Version sind, die aber derzeit noch nicht in einem C-Standard enthalten sind. Da diese Erweiterungen compilerspezifisch sind, kann davon ausgegangen werden, dass sie nicht crosskompatibel sind, und Compilerentwickler können sie in späteren Compilerversionen entfernen oder ändern. Die Verwendung solcher Erweiterungen kann im Allgemeinen durch Compilerflags gesteuert werden.
Darüber hinaus verfügen viele Entwickler über Compiler, die nur bestimmte Versionen von C unterstützen, die von der Umgebung oder Plattform, auf die sie abzielen, festgelegt werden.
Wenn Sie einen Compiler auswählen, wird empfohlen, einen Compiler auszuwählen, der die beste Unterstützung für die neueste Version von C bietet, die für die Zielumgebung zulässig ist.
Code-Stil (Off-Topic hier):
Da Leerzeichen in C unbedeutend sind (das heißt, sie beeinflussen nicht die Funktionsweise des Codes), verwenden Programmierer häufig Leerzeichen, um den Code lesbarer und verständlicher zu machen. Dies wird als Codestil bezeichnet . Es ist ein Satz von Regeln und Richtlinien, die beim Schreiben des Quellcodes verwendet werden. Es werden Bedenken behandelt, wie Zeilen eingerückt werden sollen, ob Leerzeichen oder Tabulatoren verwendet werden sollen, wie Klammern gesetzt werden sollten, wie Leerzeichen um Operatoren und Klammern verwendet werden sollten, wie Variablen benannt werden sollten und so weiter.
Der Code-Stil wird nicht durch den Standard abgedeckt und basiert hauptsächlich auf der Meinung (verschiedene Personen finden unterschiedliche Stile für besser lesbar). Daher wird er im Allgemeinen für SO als Off-Topic betrachtet. Der übergeordnete Ratschlag zum Stil im eigenen Code lautet, dass Konsistenz oberste Priorität hat - wählen Sie einen Stil aus und machen Sie ihn zu einem Stil. Es genügt zu erklären, dass es verschiedene benannte Stile gibt, die häufig von Programmierern ausgewählt werden, anstatt einen eigenen Stil zu erstellen.
Einige gängige Einrückungsstile sind: K & R-Stil, Allman-Stil, GNU-Stil usw. Einige dieser Stile haben unterschiedliche Varianten. Allman wird beispielsweise als regulärer Allman oder als beliebte Variante Allman-8 verwendet. Informationen zu einigen der beliebtesten Stile finden Sie in der Wikipedia . Solche Stilnamen werden von den Standards verwendet, die die Autoren oder Organisationen häufig für die Verwendung durch viele Personen veröffentlichen, die zu ihrem Code beitragen, sodass jeder den Code leicht lesen kann, wenn er den Stil kennt, wie beispielsweise der GNU-Formatierungsleitfaden , aus dem ein Teil besteht das GNU-Kodierungsstandards- Dokument.
Einige gebräuchliche Namenskonventionen sind: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS usw. Diese Stile werden auf verschiedene Weise kombiniert, um sie mit verschiedenen Objekten und Typen zu verwenden (z. B. verwenden Makros häufig den ALL_CAPS-Stil).
Der K & R-Stil wird im Allgemeinen für die Verwendung in der SO-Dokumentation empfohlen, während die eher esoterischen Stile wie Pico nicht empfohlen werden.
Bibliotheken und APIs, die nicht durch den C-Standard abgedeckt sind (und daher hier außerhalb des Themas liegen):
Versionen
Ausführung | Standard | Veröffentlichungsdatum |
---|---|---|
K & R | n / a | 1978-02-22 |
C89 | ANSI X3.159-1989 | 1989-12-14 |
C90 | ISO / IEC 9899: 1990 | 1990-12-20 |
C95 | ISO / IEC 9899 / AMD1: 1995 | 1995-03-30 |
C99 | ISO / IEC 9899: 1999 | 1999-12-16 |
C11 | ISO / IEC 9899: 2011 | 2011-12-15 |
Hallo Welt
Um ein einfaches C-Programm zu erstellen, das "Hello, World" auf dem Bildschirm hello.c
, erstellen Sie mit einem Texteditor eine neue Datei (z. B. hello.c
- die Dateierweiterung muss .c
), die folgenden Quellcode enthält:
Hallo c
#include <stdio.h>
int main(void)
{
puts("Hello, World");
return 0;
}
Schauen wir uns dieses einfache Programm Zeile für Zeile an
#include <stdio.h>
Diese Zeile weist den Compiler an, den Inhalt der Standardbibliothekskopfdatei stdio.h
in das Programm aufzunehmen. Header sind in der Regel Dateien, die Funktionsdeklarationen, Makros und Datentypen enthalten. Sie müssen die Headerdatei angeben, bevor Sie sie verwenden. Diese Zeile enthält stdio.h
damit sie die Funktion puts()
aufrufen kann.
Weitere Informationen zu Headern.
int main(void)
Diese Zeile startet die Definition einer Funktion. Sie enthält den Namen der Funktion ( main
), den Typ und die Anzahl der erwarteten Argumente ( void
, bedeutet none) und den Wertetyp, den diese Funktion zurückgibt ( int
). Die Programmausführung beginnt in der Funktion main()
.
{
…
}
Die geschweiften Klammern werden paarweise verwendet, um anzuzeigen, wo ein Codeblock beginnt und endet. Sie können auf viele Arten verwendet werden, aber in diesem Fall geben sie an, wo die Funktion beginnt und endet.
puts("Hello, World");
Diese Zeile ruft die Funktion put puts()
auf, um Text an die Standardausgabe (standardmäßig der Bildschirm) auszugeben, gefolgt von einem Zeilenumbruch. Die auszugebende Zeichenfolge ist in den Klammern enthalten.
"Hello, World"
ist die Zeichenfolge, die auf den Bildschirm geschrieben wird. In C muss jeder String-Literalwert in den Anführungszeichen "…"
.
Erfahren Sie mehr über Saiten.
In C-Programmen muss jede Anweisung mit einem Semikolon (dh ;
) abgeschlossen werden.
return 0;
Bei der Definition von main()
haben wir es als Funktion deklariert, die ein int
, dh es muss eine ganze Zahl zurückgegeben werden. In diesem Beispiel wird der ganzzahlige Wert 0 zurückgegeben, der angibt, dass das Programm erfolgreich beendet wurde. Nach der return 0;
Anweisung wird der Ausführungsprozess beendet.
Programm bearbeiten
Zu den einfachen Texteditoren zählen vim
oder gedit
unter Linux oder Notepad
unter Windows. Plattformübergreifende Editoren enthalten auch Visual Studio Code
oder Sublime Text
.
Der Editor muss Klartextdateien erstellen, nicht RTF oder ein anderes Format.
Programm kompilieren und ausführen
Um das Programm auszuführen, muss diese Quelldatei ( hello.c
) zuerst in eine ausführbare Datei kompiliert werden (z. B. hello
unter Unix / Linux oder hello.exe
unter Windows). Dies geschieht mit einem Compiler für die C-Sprache.
Weitere Informationen zum Kompilieren
Mit GCC kompilieren
GCC (GNU Compiler Collection) ist ein weit verbreiteter C-Compiler. Öffnen Sie dazu ein Terminal, navigieren Sie mithilfe der Befehlszeile zum Speicherort der Quelldatei und führen Sie dann Folgendes aus:
gcc hello.c -o hello
Wenn im Quellcode ( hello.c
) keine Fehler gefunden werden, erstellt der Compiler eine Binärdatei , deren Name durch das Argument der Befehlszeilenoption -o
( hello
) angegeben wird. Dies ist die endgültige ausführbare Datei.
Wir können auch die -Wall -Wextra -Werror
, mit deren Hilfe Probleme identifiziert werden, die dazu führen können, dass das Programm fehlschlägt oder unerwartete Ergebnisse -Wall -Wextra -Werror
. Sie sind für dieses einfache Programm nicht notwendig, aber es ist eine Möglichkeit, sie hinzuzufügen:
gcc -Wall -Wextra -Werror -o hello hello.c
Verwendung des Clang-Compilers
Um das Programm mit clang
zu kompilieren, können Sie clang
verwenden:
clang -Wall -Wextra -Werror -o hello hello.c
Die Befehlszeilenoptionen von clang
ähneln denen von GCC.
Verwenden des Microsoft C-Compilers über die Befehlszeile
Wenn Sie den Microsoft cl.exe
Compiler auf einem Windows-System verwenden, das Visual Studio unterstützt, und wenn alle Umgebungsvariablen festgelegt sind, kann dieses C-Beispiel mit dem folgenden Befehl kompiliert werden, der eine ausführbare Datei hello.exe
im Verzeichnis hello.exe
in dem der Befehl ausgeführt wird (Es gibt -Wall
wie /W3
für cl
, ungefähr analog zu -Wall
usw. für GCC oder Clang).
cl hello.c
Programm ausführen
Nach dem Kompilieren kann die Binärdatei durch Eingabe von ./hello
in das Terminal ausgeführt werden. Nach der Ausführung gibt das kompilierte Programm Hello, World
und eine neue Zeile an die Eingabeaufforderung aus.
Original "Hallo, Welt!" in K & R C
Folgendes ist das Original "Hallo, Welt!" Programm aus dem Buch The C Programming Language von Brian Kernighan und Dennis Ritchie (Ritchie war der ursprüngliche Entwickler der C-Programmiersprache bei Bell Labs), als "K & R" bezeichnet:
#include <stdio.h>
main()
{
printf("hello, world\n");
}
Beachten Sie, dass die Programmiersprache C zum Zeitpunkt der Erstellung der ersten Ausgabe dieses Buches (1978) nicht standardisiert war und dass dieses Programm wahrscheinlich auf den meisten modernen Compilern nicht kompiliert werden kann, wenn sie nicht dazu aufgefordert werden, C90-Code zu akzeptieren.
Dieses erste Beispiel im K & R-Buch wird jetzt als schlechte Qualität angesehen, zum Teil weil es einen expliziten Rückgabetyp für main()
und zum Teil weil es keine return
. Die 2. Auflage des Buches wurde für den alten C89-Standard geschrieben. In C89 würde der Typ von main
standardmäßig int
, das K & R-Beispiel gibt jedoch keinen definierten Wert an die Umgebung zurück. In C99 und späteren Standards ist der Rückgabetyp erforderlich, aber es ist sicher, die return
von main
(und nur main
) auszulassen, da ein Sonderfall mit C99 5.1.2.2.3 eingeführt wurde. Dies ist gleichbedeutend mit der Rückgabe von 0 was auf Erfolg hinweist.
Die empfohlene und meist tragbare Form von main
für gehostete Systeme ist int main (void)
wenn das Programm keine Befehlszeilenargumente verwendet, oder int main(int argc, char **argv)
wenn das Programm die Befehlszeilenargumente verwendet.
C90 §5.1.2.2.3 Programmbeendigung
Eine Rückkehr vom ersten Aufruf an die
main
entspricht dem Aufruf derexit
Funktion mit dem von dermain
zurückgegebenen Wert als Argument. Wenn diemain
eine Rückgabe ausführt, die keinen Wert angibt, ist der an die Host-Umgebung zurückgegebene Beendigungsstatus nicht definiert.
C90 §6.6.6.4 Die return
Wenn eine
return
Anweisung ohne Ausdruck ausgeführt wird und der Wert des Funktionsaufrufs vom Aufrufer verwendet wird, ist das Verhalten undefiniert. Das}
, das eine Funktion beendet, entspricht der Ausführung einerreturn
Anweisung ohne einen Ausdruck.
C99 §5.1.2.2.3 Programmbeendigung
Wenn der Rückgabetyp der
main
ein mitint
kompatibler Typ ist, entspricht eine Rückkehr vom ersten Aufruf an diemain
dem Aufruf derexit
Funktion mit dem von dermain
zurückgegebenen Wert als Argument. Wenn Sie das}
, das diemain
beendet, wird der Wert 0 zurückgegeben. Wenn der Rückgabetyp nicht mitint
kompatibel ist, ist der an die Host-Umgebung zurückgegebene Beendigungsstatus nicht angegeben.