C LanguageErste Schritte mit C Language

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:

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;
}
 

Live-Demo auf Coliru

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:

K & R
#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 der exit Funktion mit dem von der main zurückgegebenen Wert als Argument. Wenn die main 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 einer return Anweisung ohne einen Ausdruck.

C99 §5.1.2.2.3 Programmbeendigung

Wenn der Rückgabetyp der main ein mit int kompatibler Typ ist, entspricht eine Rückkehr vom ersten Aufruf an die main dem Aufruf der exit Funktion mit dem von der main zurückgegebenen Wert als Argument. Wenn Sie das } , das die main beendet, wird der Wert 0 zurückgegeben. Wenn der Rückgabetyp nicht mit int kompatibel ist, ist der an die Host-Umgebung zurückgegebene Beendigungsstatus nicht angegeben.