C (Programmiersprache)

C (ausgesprochen, wie wie der Brief C "sehen") ist eine Mehrzweckcomputerprogrammiersprache, die zwischen 1969 und 1973 durch Dennis Ritchie an den Glockentelefonlaboratorien für den Gebrauch mit Unix Betriebssystem entwickelt ist.

Obwohl C entworfen wurde, um Systemsoftware durchzuführen, wird er auch weit verwendet, um tragbare Anwendungssoftware zu entwickeln.

C ist eine der am weitesten verwendeten Programmiersprachen aller Zeiten, und es gibt sehr wenige Computerarchitekturen, für die ein C Bearbeiter nicht besteht. C hat viele andere populäre Programmiersprachen, am meisten namentlich C ++ außerordentlich beeinflusst, der als eine Erweiterung auf C begonnen hat.

Design

C ist eine befehlende (verfahrensrechtliche) Systemdurchführungssprache. Es wurde entworfen, um mit einem relativ aufrichtigen Bearbeiter kompiliert zu werden, auf niedriger Stufe Zugang zum Gedächtnis zur Verfügung zu stellen, Sprachkonstruktionen zur Verfügung zu stellen, die effizient zu Maschineninstruktionen kartografisch darstellen, und minimale Laufzeitunterstützung zu verlangen. C war deshalb für viele Anwendungen nützlich, die früher auf der Zusammenbau-Sprache codiert worden waren.

Trotz seiner auf niedriger Stufe Fähigkeiten wurde die Sprache entworfen, um Quer-Plattform-Programmierung zu fördern. Ein standardentgegenkommendes und tragbar geschriebenes C Programm kann für ein sehr großes Angebot an Computerplattformen und Betriebssystemen mit wenigen Änderungen zu seinem Quellcode kompiliert werden. Die Sprache ist verfügbar auf einer sehr breiten Reihe von Plattformen von eingebetteten Mikrokontrolleuren zu Supercomputern geworden.

Eigenschaften

Wie die meisten befehlenden Sprachen in der Algol-Tradition hat C Möglichkeiten für die strukturierte Programmierung und erlaubt lexikalisches variables Spielraum und recursion, während ein statisches Typ-System viele unbeabsichtigte Operationen verhindert. In C wird der ganze rechtskräftige Code innerhalb von Unterprogrammen enthalten, die "Funktionen" (obwohl nicht im strengen Sinn der funktionellen Programmierung) genannt werden. Funktionsrahmen werden immer durch den Wert passiert. Vorbeigehen-Verweisung wird in C durch ausführlich vorübergehende Zeigestock-Werte vorgetäuscht. C Programm-Quelltext ist freies Format, mit dem Strichpunkt als eine Behauptung terminator und lockige geschweifte Klammern, um Blöcke von Behauptungen zu gruppieren.

Die c Sprache stellt auch die folgenden spezifischeren Eigenschaften aus:

  • Es gibt eine kleine, festgelegte Zahl von Schlüsselwörtern einschließlich eines vollen Satzes des Flusses von Kontrollprimitiven: und. Es gibt grundsätzlich einen namespace, und benutzerbestimmte Namen sind von Schlüsselwörtern durch keine Art von sigil bemerkenswert.
  • Es gibt eine Vielzahl von arithmetischen und logischen Maschinenbedienern, solcher als usw.
  • Mehr als eine Anweisung kann in einer einzelnen Behauptung durchgeführt werden.
  • Funktionsrückwerte können wenn nicht erforderlich ignoriert werden.
  • Das Schreiben ist statisch, aber schwach erzwungen: Alle Daten haben einen Typ, aber implizite Konvertierungen können durchgeführt werden; zum Beispiel können Charaktere als ganze Zahlen verwendet werden.
  • Behauptungssyntax ahmt Gebrauch-Zusammenhang nach. C hat nicht "definieren" Schlüsselwort; statt dessen wird eine Behauptung, die mit dem Namen eines Typs beginnt, als eine Behauptung genommen. Es gibt kein "Funktions"-Schlüsselwort; statt dessen wird eine Funktion durch die Parenthesen einer Argument-Liste angezeigt.
  • Benutzerbestimmt und zusammengesetzte Typen sind möglich.
  • Heterogene gesamte Datentypen erlauben verwandten Datenelementen, zugegriffen, zum Beispiel als eine Einheit zugeteilt zu werden.
  • Das Reihe-Indexieren ist ein sekundärer Begriff, der in Bezug auf die Zeigestock-Arithmetik definiert ist. Verschieden von structs ist Reihe nicht erstklassige Gegenstände; sie können nicht zugeteilt werden oder haben verwendende einzelne eingebaute Maschinenbediener verglichen. Es gibt kein "Reihe"-Schlüsselwort, im Gebrauch oder der Definition; statt dessen zeigen eckige Klammern Reihe syntaktisch z.B an.
  • Aufgezählte Typen sind mit dem Schlüsselwort möglich. Sie werden nicht markiert, und sind mit ganzen Zahlen frei zwischenkonvertierbar.
  • Schnuren sind nicht ein getrennter Datentyp, aber werden als ungültig begrenzte Reihe von Charakteren herkömmlich durchgeführt.
  • Der auf niedriger Stufe Zugang zum Computergedächtnis ist durch das Umwandeln von Maschinenadressen zu getippten Zeigestöcken möglich.
  • Verfahren (Unterprogramme, Werte nicht zurückgebend), sind ein spezieller Fall der Funktion mit einem Scheinrücktyp.
  • Funktionen dürfen innerhalb des lexikalischen Spielraums anderer Funktionen nicht definiert werden.
  • Funktion und Datenzeigestöcke erlauben Ad-Hoc-Durchlaufzeit polymorphism.
  • Ein Vorverarbeiter führt Makrodefinition, Quellcodedateieinschließung und bedingte Kompilation durch.
  • Es gibt eine grundlegende Form der Modularität: Dateien können getrennt kompiliert und zusammen mit der Kontrolle verbunden werden, über die Funktionen und Datengegenstände zu anderen Dateien über und Attributen sichtbar sind.
  • Komplizierte Funktionalität wie Eingabe/Ausgabe, Schnur-Manipulation und mathematische Funktionen wird an Bibliotheksroutinen durchweg delegiert.

C schließt einige Eigenschaften nicht ein, die in neuere, modernere höhere Programmiersprachen gefunden sind, einschließlich:

Geschichte

Frühe Entwicklungen

Die anfängliche Entwicklung von C ist an AT&T Glockenlaboratorien zwischen 1969 und 1973 vorgekommen; gemäß Ritchie ist die kreativste Periode 1972 vorgekommen. Es wurde "C" genannt, weil seine Eigenschaften aus genanntem "B" einer früheren Sprache abgeleitet wurden, der gemäß Ken Thompson eine unten abgezogene Version der BCPL Programmiersprache war.

Der Ursprung von C wird an die Entwicklung von Unix Betriebssystem nah gebunden, das ursprünglich auf der Zusammenbau-Sprache auf einem PDP-7 von Ritchie und Thompson durchgeführt ist, mehrere Ideen von Kollegen vereinigend. Schließlich haben sie sich dafür entschieden, das Betriebssystem zu einem PDP-11 zu tragen. Die Unfähigkeit von B, einige von den Eigenschaften des PDP-11, namentlich Byte-Adressierbarkeit auszunutzen, hat zur Entwicklung einer frühen Version von C geführt.

Die ursprüngliche PDP-11 Version des Systems von Unix wurde auf der Zusammenbau-Sprache entwickelt. Vor 1973, mit der Hinzufügung von Typen, war die c Sprache stark genug geworden, dass der grösste Teil des Kerns von Unix in C umgeschrieben wurde. Das war einer der ersten Betriebssystemkerne, die auf einer Sprache durchgeführt sind, außer dem Zusammenbau. (Frühere Beispiele schließen das System von Multics (geschrieben in PL/I), und MCP (Master-Kontrollprogramm) für den Burroughs B5000 ein, der im Algol 1961 geschrieben ist.)

K&R C

1978 haben Brian Kernighan und Dennis Ritchie die Erstausgabe Der C Programmiersprache veröffentlicht. Dieses Buch, das C Programmierern als "K&R" bekannt ist, hat viele Jahre lang als eine informelle Spezifizierung der Sprache gedient. Die Version von C, den es beschreibt, wird allgemein K&R C genannt. Die zweite Ausgabe der Buchumschläge später ANSI C Standard.

K&R hat mehrere Spracheigenschaften eingeführt:

  • Standardeingabe/Ausgabe-Bibliothek
  • Datentyp
Datentyp
  • zusammengesetzte Anweisungsmaschinenbediener der Form op (solcher als) wurden zur Form op geändert, um die semantische Zweideutigkeit zu entfernen, die durch solche Konstruktionen wie geschaffen ist, der als statt des vielleicht beabsichtigten interpretiert worden war

Sogar nach der Veröffentlichung von 1989 C Standard viele Jahre lang K&R wurde C noch als der "kleinste gemeinsame Nenner" betrachtet, zu dem C Programmierer sich eingeschränkt haben, als maximale Beweglichkeit gewünscht wurde, seitdem viele ältere Bearbeiter noch im Gebrauch waren, und weil sorgfältig geschrieben K&R C Code gesetzlicher Standard C ebenso sein kann.

In frühen Versionen von C mussten nur Funktionen, die nicht - Wert zurückgekehrt sind, wenn verwendet, vor der Funktionsdefinition erklärt werden; wie man annahm, hat eine ohne jede vorherige Behauptung verwendete Funktion Typ zurückgegeben, wenn sein Wert verwendet wurde.

Zum Beispiel:

langer some_function ;

/* interne Nummer */other_function ;

/* interne Nummer */calling_function

{\

langer test1;

schreiben Sie/* interne Nummer */test2 ein;

test1 = some_function ;

wenn (test1> 0)

test2 = 0;

sonst

test2 = other_function ;

geben Sie test2 zurück;

}\

</syntaxhighlight>

Alle obengenannten kommentierten Behauptungen konnten in K&R C weggelassen werden.

Seitdem K&R haben Funktionsbehauptungen keine Information über Funktionsargumente eingeschlossen, Funktionsparameter-Typ-Kontrollen wurden nicht durchgeführt, obwohl einige Bearbeiter eine Warnungsnachricht ausgeben würden, wenn eine lokale Funktion mit der falschen Zahl von Argumenten genannt würde, oder wenn vielfache Anrufe zu einer Außenfunktion verschiedene Zahlen oder Typen von Argumenten verwendet haben. Getrennte Werkzeuge wie das Scharpie-Dienstprogramm von Unix wurden entwickelt, der (unter anderem) für die Konsistenz des Funktionsgebrauches über vielfache Quelldateien überprüfen konnte.

In den Jahren im Anschluss an die Veröffentlichung K&R C wurden mehrere inoffizielle Eigenschaften zur Sprache hinzugefügt, die durch Bearbeiter von AT&T und einige andere Verkäufer unterstützt ist. Diese haben eingeschlossen:

  • Funktionen (d. h. Funktionen ohne Rückwert)
  • das Funktionszurückbringen oder die Typen (aber nicht Zeigestöcke)
  • Anweisung für Datentypen
  • aufgezählte Typen

Die Vielzahl von Erweiterungen und fehlt vom Konsens über eine Standardbibliothek, zusammen mit der Sprachbeliebtheit und der Tatsache, dass nicht sogar die Bearbeiter von Unix genau K&R Spezifizierung durchgeführt haben, hat zur Notwendigkeit der Standardisierung geführt.

ANSI C und ISO C

Während des Endes der 1970er Jahre und der 1980er Jahre wurden Versionen von C für ein großes Angebot an Großrechner-Computern, Minicomputern und Mikrocomputern einschließlich IBM PC durchgeführt, weil seine Beliebtheit begonnen hat, bedeutsam zuzunehmen.

1983 hat American National Standards Institute (ANSI) ein Komitee, X3J11 gebildet, um eine Standardspezifizierung von C zu gründen. X3J11 hat den C Standard auf der Durchführung von Unix gestützt; jedoch wurde vom nichttragbaren Teil des Unix C Bibliothek der IEEE Arbeitsgruppe 1003 gereicht, um die Basis für den POSIX 1988-Standard zu werden. 1989 wurde der C Standard als ANSI X3.159-1989 "Programmiersprache C" bestätigt. Diese Version der Sprache wird häufig ANSI C, Standard C, oder manchmal C89 genannt.

1990 wurde der ANSI C Standard (mit der Formatierung von Änderungen) von der Internationalen Organisation für die Standardisierung (ISO) als ISO/IEC 9899:1990 angenommen, der manchmal C90 genannt wird. Deshalb beziehen sich die Begriffe "C89" und "C90" auf dieselbe Programmiersprache.

ANSI, wie andere nationale Standardkörper, entwickelt nicht mehr den C Standard unabhängig, aber gibt dem internationalen C Standard nach, der von der Arbeitsgruppe ISO/IEC JTC1/SC22/WG14 aufrechterhalten ist. Die nationale Adoption einer Aktualisierung zum internationalen Standard kommt normalerweise innerhalb eines Jahres der ISO Veröffentlichung vor.

Eines der Ziele des C Standardisierungsprozesses sollte eine Obermenge K&R C erzeugen, viele der inoffiziellen nachher eingeführten Eigenschaften vereinigend. Das Standardkomitee hat auch mehrere zusätzliche Eigenschaften wie Funktionsprototypen (geliehen von C ++), Zeigestöcke, Unterstützung für internationale Codierungen und Schauplätze und Vorverarbeiter-Erhöhungen eingeschlossen. Obwohl die Syntax für Parameter-Behauptungen vermehrt wurde, um den Stil einzuschließen, der in C ++, K&R verwendet ist, hat Schnittstelle fortgesetzt, für die Vereinbarkeit mit dem vorhandenen Quellcode erlaubt zu werden.

C89 wird durch den Strom C Bearbeiter unterstützt, und der grösste Teil des C-Codes, der heute wird schreibt, basiert darauf. Jedes Programm schriftlich nur im Standard C und ohne irgendwelche von der Hardware abhängigen Annahmen wird richtig auf jeder Plattform mit einem Anpassen C Durchführung innerhalb seiner Quellengrenzen führen. Ohne solche Vorsichtsmaßnahmen können Programme nur auf einer bestimmten Plattform oder mit einem besonderen Bearbeiter, erwartet, zum Beispiel, zum Gebrauch von Sonderbibliotheken, wie GUI-Bibliotheken, oder zu einem Vertrauen auf dem Bearbeiter - oder mit der Plattform spezifische Attribute wie die genaue Größe von Datentypen und Byte endianness kompilieren.

In Fällen, wo Code compilable entweder durch das Standardanpassen oder durch K&R C-basierte Bearbeiter sein muss, kann das Makro verwendet werden, um den Code in den Standard und K&R Abteilungen zu spalten, um den Gebrauch auf K&R C-basierter Bearbeiter von Eigenschaften verfügbar nur im Standard C zu verhindern.

C99

Nach dem ANSI/ISO Standardisierungsprozess ist die Spezifizierung der c Sprache relativ statisch seit mehreren Jahren geblieben. 1995 wurde der Normative Zusatzartikel 1 bis 1990 C Standard veröffentlicht, um einige Details zu korrigieren und umfassendere Unterstützung für internationale Codierungen hinzuzufügen. Der C Standard wurde weiter gegen Ende der 1990er Jahre revidiert, zur Veröffentlichung von ISO/IEC 9899:1999 1999 führend, der allgemein "C99" genannt wird. Es ist dreimal durch die Technische Berichtigung seitdem amendiert worden.

C99 hat mehrere neue Eigenschaften, einschließlich Reihenfunktionen, mehrere neue Datentypen (einschließlich und ein Typ eingeführt, um komplexe Zahlen zu vertreten), Reihe der variablen Länge, verbesserte Unterstützung für IEEE 754 Schwimmpunkt, Unterstützung für variadic Makros (Makros der Variable arity) und Unterstützung für Fachanmerkungen, die mit, als in BCPL oder C ++ beginnen. Viele von diesen waren bereits als Erweiterungen in mehreren C Bearbeitern durchgeführt worden.

C99 ist größtenteils mit C90 rückwärts kompatibel, aber ist in mancher Hinsicht strenger; insbesondere eine Behauptung, die an einem Typ specifier nicht mehr Mangel hat, hat implizit angenommen. Ein Standardmakro wird mit dem Wert definiert, um anzuzeigen, dass C99-Unterstützung verfügbar ist. GCC, Solaris Studio und andere C Bearbeiter unterstützen jetzt viele oder alle neuen Eigenschaften von C99.

C11

2007 hat Arbeit auf einer anderen Revision des C Standards, informell genannt "C1X" bis zu seiner offiziellen Veröffentlichung am 2011-12-08 begonnen. Das C Standardkomitee hat Richtlinien angenommen, um die Adoption von neuen Eigenschaften zu beschränken, die durch vorhandene Durchführungen nicht geprüft worden waren.

Der C11 Standard fügt zahlreiche neue Eigenschaften zu C und der Bibliothek einschließlich des Typs hinzu allgemeine Makros, anonyme Strukturen, haben Unterstützung von Unicode, Atomoperationen, Nebenläufigkeit und Grenze-karierte Funktionen verbessert. Es macht auch einige Teile der vorhandenen C99 Bibliothek fakultativ, und verbessert Vereinbarkeit mit C ++.

Eingebetteter C

Historisch verlangt eingebettete C-Programmierung Sondererweiterungen in die c Sprache, um exotische Eigenschaften wie Festkommaarithmetik, vielfache verschiedene Speicherbanken und grundlegende Eingabe/Ausgabe-Operationen zu unterstützen.

2008 hat das C Standardkomitee einen technischen Bericht veröffentlicht, der die c Sprache erweitert, um diese Probleme durch die Versorgung eines allgemeinen Standards für alle Durchführungen zu richten, um daran zu kleben. Es schließt mehrere Eigenschaften ein, die in normalem C wie Festkommaarithmetik nicht verfügbar sind, genannt Adressräume und das grundlegende Eingabe/Ausgabe-Hardware-Wenden.

Gebrauch

C wird häufig für die "Systemprogrammierung", einschließlich des Einführens von Betriebssystemen und eingebetteten Systemanwendungen, wegen einer Kombination von wünschenswerten Eigenschaften wie Codebeweglichkeit und Leistungsfähigkeit, Fähigkeit verwendet, auf spezifische Hardware-Adressen, Fähigkeit zuzugreifen, Typen zu witzeln, um äußerlich auferlegte Datenzugriffsvoraussetzungen und niedrige Laufzeitnachfrage auf Systemmitteln zu vergleichen. C kann auch für die Website-Programmierung mit CGI als ein "Tor" für die Information zwischen der Webanwendung, dem Server und dem Browser verwendet werden. Einige Gründe dafür, C über interpretierte Sprachen zu wählen, sind seine Geschwindigkeit, Stabilität und nah-universale Verfügbarkeit.

Eine Folge der breiten Verfügbarkeit und Leistungsfähigkeit von C ist, dass Bearbeiter, Bibliotheken und Dolmetscher anderer Programmiersprachen häufig in C durchgeführt werden. Die primären Durchführungen der Pythonschlange (CPython), Perl 5, und PHP werden alle in C geschrieben.

Wegen seiner dünnen Schicht der Abstraktion und niedrig oben erlaubt C effiziente Durchführungen von Algorithmen und Datenstrukturen, der für Programme nützlich ist, die viel Berechnung durchführen. Zum Beispiel wird die GNU-Mehrpräzisionsbibliothek, das GNU Wissenschaftliche Bibliothek, Mathematica und MATLAB in C völlig oder teilweise geschrieben.

C wird manchmal als eine Zwischensprache durch Durchführungen anderer Sprachen verwendet. Diese Annäherung kann für die Beweglichkeit oder Bequemlichkeit verwendet werden; durch das Verwenden C als eine Zwischensprache ist es nicht notwendig, maschinenspezifische Codegeneratoren zu entwickeln. Einige Sprachen und Bearbeiter, die C dieser Weg verwendet haben, sind BitC, C ++, COBOL, Eiffel, Gambit, GHC, Modula-3, Quieken und Vala. Jedoch wurde C als eine Programmiersprache entworfen, nicht als eine Bearbeiter-Zielsprache, und ist so weniger als Ideal für den Gebrauch als eine Zwischensprache. Das hat zu Entwicklung von C-basierten Zwischensprachen wie C geführt-.

C ist auch weit verwendet worden, um Endbenutzer-Anwendungen durchzuführen, aber viel von dieser Entwicklung hat sich in neuere Sprachen bewegt.

Syntax

C ließ eine formelle Grammatik durch den C Standard angeben. Verschieden von Sprachen wie FORTRAN 77, C Quellcode ist freie Form, die willkürlichem Gebrauch von whitespace erlaubt, Code, aber nicht säulenbasierte oder textlinienbasierte Beschränkungen zu formatieren. Anmerkungen können entweder zwischen den Begrenzungszeichen und, oder (seit C99) im Anschluss an bis zum Ende der Linie erscheinen.

C Quelldateien enthalten Behauptungen und Funktionsdefinitionen. Funktionsdefinitionen enthalten abwechselnd Behauptungen und Erklärungen. Behauptungen entweder definieren neue Typen mit Schlüsselwörtern solcher als, und, oder teilen Typen dem zu und bestellen vielleicht Lagerung für neue Variablen, gewöhnlich durch das Schreiben des vom Variablennamen gefolgten Typs vor. Schlüsselwörter solcher als und geben eingebaute Typen an. Abteilungen des Codes werden in geschweiften Klammern eingeschlossen (und, manchmal "lockige Klammern" genannt), das Spielraum von Behauptungen zu beschränken und als eine einzelne Behauptung für Kontrollstrukturen zu handeln.

Als eine befehlende Sprache verwendet C Behauptungen, um Handlungen anzugeben. Die allgemeinste Behauptung ist eine Ausdruck-Behauptung, aus einem zu bewertenden Ausdruck bestehend, von einem Strichpunkt gefolgt; als eine Nebenwirkung der Einschätzung können Funktionen genannt werden, und Variablen können neue Werte zugeteilt werden. Um die normale folgende Ausführung von Behauptungen zu modifizieren, stellt C mehrere durch vorbestellte Schlüsselwörter identifizierte Kontrollfluss-Behauptungen zur Verfügung. Strukturierte Programmierung wird durch (-) bedingte Ausführung und durch - und wiederholende (sich schlingende) Ausführung unterstützt. Die Behauptung hat getrennte Initialisierung, Prüfung, und Neuinitialisierungsausdrücke, irgendwelchen, oder von denen alle weggelassen werden können. und kann verwendet werden, um die innerste Umgeben-Schleife-Behauptung oder den Hopser zu seiner Neuinitialisierung zu verlassen. Es gibt auch eine nichtstrukturierte Behauptung der Zweige direkt zum benannten Etikett innerhalb der Funktion. wählt aus, um gestützt auf dem Wert eines Ausdrucks der ganzen Zahl durchgeführt zu werden.

Ausdrücke können eine Vielfalt von eingebauten Maschinenbedienern (sieh unten) verwenden und können Funktionsanrufe enthalten. Die Ordnung, in der Argumente für Funktionen und operands den meisten Maschinenbedienern bewertet werden, ist unangegeben. Die Einschätzungen können sogar durchgeschossen werden. Jedoch werden alle Nebenwirkungen (einschließlich der Lagerung zu Variablen) vor dem folgenden "Folge-Punkt" vorkommen; Folge-Punkte schließen das Ende jeder Ausdruck-Behauptung und den Zugang dazu ein und kehren von jedem Funktionsanruf zurück. Folge-Punkte kommen auch während der Einschätzung von Ausdrücken vor, die bestimmte Maschinenbediener (und den Komma-Maschinenbediener) enthalten. Das erlaubt einen hohen Grad der Gegenstand-Codeoptimierung durch den Bearbeiter, aber verlangt, dass C Programmierer mehr Sorge nehmen, um zuverlässige Ergebnisse zu erhalten, als es für andere Programmiersprachen erforderlich ist.

Codierung

Die grundlegende C Quellcodierung schließt die folgenden Charaktere ein:

  • Briefe: - -
  • Ziffern: -
  • Zeichensetzung:
  • Charaktere von Whitespace: Raum, horizontales Etikett, vertikales Etikett, bildet Futter, newline

Newline zeigt das Ende einer Textlinie an; es braucht keinem wirklichen einzelnen Charakter zu entsprechen, obwohl für die Bequemlichkeit C es als ein behandelt.

Zusätzliches Mehrbyte hat Charaktere verschlüsselt kann verwendet werden, aber sind nicht tragbar.

Der letzte C Standard (C11) erlaubt multinationalen Charakteren von Unicode, tragbar innerhalb des C Quelltexts durch das Verwenden einer Verschlüsselung eingebettet zu werden (wo einen Charakter-Code von Unicode anzeigt), obwohl diese Eigenschaft noch nicht weit durchgeführt wird.

Die grundlegende C Ausführungscodierung enthält dieselben Charaktere, zusammen mit Darstellungen für das Alarmsignal, den Rückwärtsschritt und die Wagen-Rückkehr.

Die Laufzeitunterstützung für verlängerte Codierungen hat mit jeder Revision des C Standards zugenommen.

Schlüsselwörter

C89 hat 32 Schlüsselwörter (vorbestellte Wörter mit der speziellen Bedeutung):

::::::::::::::::::::::::::::::::

C99 fügt noch fünf Schlüsselwörter hinzu:

:::::

C11 fügt noch sieben Schlüsselwörter hinzu:

:::::::

Die meisten kürzlich zusätzlichen Schlüsselwörter beginnen mit einem von einem Großbuchstaben gefolgten Unterstreichen, weil Bezeichner dieser Form vorher durch den C Standard für den Gebrauch nur durch Durchführungen vorbestellt wurden. Seitdem vorhandener Programm-Quellcode diese Bezeichner nicht verwendet haben sollte, würde er nicht betroffen, als C Durchführungen angefangen haben, diese Erweiterungen auf die Programmiersprache zu unterstützen.

Maschinenbediener

C unterstützt einen reichen Satz von Maschinenbedienern, die innerhalb eines Ausdrucks verwendete Symbole sind, um die durchzuführenden Manipulationen anzugeben, während sie diesen Ausdruck bewerten. C hat Maschinenbediener für:

  • Arithmetik:
  • Anweisung:
  • vermehrte Anweisung:
  • Bitwise-Logik:
  • Bitwise-Verschiebungen:
  • Boolean-Logik:
  • :
  • Gleichheitsprüfung:
  • das Benennen von Funktionen:
  • Zunahme und Verminderung:
  • Mitglied-Auswahl:
  • Gegenstand-Größe:
  • Ordnungsbeziehungen:
  • Verweisung und dereference:
  • sequencing:
  • Subausdruck-Gruppierung:
  • Typ-Konvertierung:

Kritik

Obwohl nachgeahmt, durch viele Sprachen wegen seiner weit verbreiteten Vertrautheit ist die Syntax von C häufig kritisiert worden. Kernighan und Ritchie sagen in der Einführung Der C Programmiersprache, "C, wie jede andere Sprache, hat seine Makel. Einige der Maschinenbediener haben die falsche Priorität; einige Teile der Syntax konnten besser sein." Der C Standard hat nicht versucht, viele dieser Makel wegen des Einflusses solcher Änderungen auf bereits der vorhandenen Software zu korrigieren.

Einige spezifische Probleme sind:

  • Nichtintuitive Maschinenbediener-Priorität, wie Schwergängigkeit dichter als und in Ausdrücken wie, der würde geschrieben werden müssen, um richtig bewertet zu werden.
  • Gebrauch des Maschinenbedieners, der in der Mathematik vorbestellt ist, um Gleichheit auszudrücken, Anweisung, im Anschluss an den Präzedenzfall von Fortran und PL/I, aber verschieden vom Algol und seinen Ableitungen anzuzeigen.
  • Ähnlichkeit der Anweisung und Gleichheitsmaschinenbediener (und), es leicht machend, ein den anderen zufällig zu vertreten. In vielen Fällen kann jeder im Zusammenhang von anderem ohne einen Kompilationsfehler verwendet werden (obwohl einige Bearbeiter Warnungen erzeugen). Zum Beispiel ist der bedingte Ausdruck in wahr, wenn nicht Null nach der Anweisung ist.
  • Eine Behauptungssyntax, dass einige unintuitiv besonders für Funktionszeigestöcke finden. (Die Idee von Ritchie war, Bezeichner in Zusammenhängen zu erklären, die ihrem Gebrauch ähneln: "Behauptung widerspiegelt Gebrauch".)
  • Die üblichen arithmetischen Konvertierungen von C berücksichtigen effizienten Code, der zu erzeugen ist, aber können manchmal unerwartete Ergebnisse erzeugen. Zum Beispiel verlangt ein Vergleich von unterzeichneten und nicht unterzeichneten ganzen Zahlen der gleichen Breite eine Konvertierung des unterzeichneten Werts zum nicht unterzeichneten. Das kann unerwartete Ergebnisse erzeugen, wenn der unterzeichnete Wert negativ ist.
  • C hat keine implizite Kontrolle der Reihe-Größe an der Durchlaufzeit wieder aus Leistungsfähigkeitsgründen. Wenn Reihe-Größe-Überprüfung erforderlich ist, muss sie manuell getan werden.

"Hallo," Weltbeispiel

"Hallo ist" Weltbeispiel, das in der Erstausgabe K&R erschienen ist, das Modell für ein einleitendes Programm in den meisten Programmierlehrbüchern unabhängig von der Programmiersprache geworden. Das Programm druckt "hallo, Welt" zur Standardproduktion, die gewöhnlich ein Terminal oder Schirm-Display ist.

Die ursprüngliche Version war:

wichtig

{\

printf ("hallo, world\n");

}\</syntaxhighlight>

Ein Standardanpassen "hallo," Weltprogramm ist:

  1. einschließen

int Haupt(Leere)

{\ printf ("hallo, world\n");

kehren Sie 0 zurück;

}\</syntaxhighlight>

Die erste Linie des Programms enthält eine Aufbereitungsdirektive, die dadurch angezeigt ist. Das veranlasst den Bearbeiter, diese Linie durch den kompletten Text des Standardkopfballs zu ersetzen, der Behauptungen für den Standardeingang und die Produktionsfunktionen solcher als enthält. Die Winkelklammer-Umgebung zeigt an, dass das mit einer Suchstrategie gelegen wird, die Standardkopfbälle anderen Kopfbällen bevorzugt, die denselben Namen haben. (Anführungszeichen werden verwendet, um lokale oder projektspezifische Kopfball-Dateien einzuschließen.)

Die folgende Linie zeigt an, dass eine genannte Funktion definiert wird. Die Funktion dient einem speziellen Zweck in C Programmen; die Laufzeitumgebung nennt die Funktion, Programm-Ausführung zu beginnen. Der Typ specifier zeigt an, dass der Wert, der in den invoker (in diesem Fall die Laufzeitumgebung) infolge des Auswertens der Funktion zurückgegeben wird, eine ganze Zahl ist. Das Schlüsselwort als eine Parameter-Liste zeigt an, dass diese Funktion keine Argumente nimmt.

Die öffnende lockige geschweifte Klammer zeigt den Anfang der Definition der Funktion an.

Die folgenden Linienanrufe (lenkt Ausführung zu ab), hat eine Funktion genannt, der von einer Systembibliothek geliefert wird. In diesem Anruf wird die Funktion (zur Verfügung gestellt mit) ein einzelnes Argument, die Adresse des ersten Charakters in der wörtlichen Schnur passiert. Die wörtliche Schnur ist eine namenlose Reihe mit Elementen des Typs, aufgestellt automatisch durch den Bearbeiter mit einem 0 geschätzten Endcharakter, um das Ende der Reihe zu kennzeichnen (muss das wissen). Einer Flucht-Folge zu sein, die C zu einem Zeilenvorschubzeichen übersetzt, das auf der Produktion das Ende der aktuellen Linie bedeutet. Der Rückwert der Funktion ist des Typs, aber es wird still verworfen, da es nicht verwendet wird. (Ein sorgfältigeres Programm könnte den Rückwert prüfen, um zu bestimmen, ob die Funktion erfolgreich gewesen ist.) Der Strichpunkt begrenzt die Behauptung.

Die Behauptung begrenzt die Ausführung der Funktion und verursacht es, um die ganze Zahl zurückzugeben, schätzt 0, der durch das Laufzeitsystem als ein Ausgangscode interpretiert wird, der erfolgreiche Ausführung anzeigt.

Die lockige geschweifte Schlussklammer zeigt das Ende des Codes für die Funktion an.

Datentypen

C hat ein statisches schwaches tippendes Typ-System, das einige Ähnlichkeiten mit diesem anderer Algol-Nachkommen wie Pascal teilt. Es gibt eingebaute Typen für ganze Zahlen verschiedener Größen, beide unterzeichnet und nicht unterzeichnet, Schwimmpunkt-Zahlen, Charaktere und aufgezählte Typen . C99 hat einen boolean datatype hinzugefügt. Es gibt auch abgeleitete Typen einschließlich der Reihe, Zeigestöcke, Aufzeichnungen , und unmarkierte Vereinigungen .

C wird häufig in der auf niedriger Stufe Systemprogrammierung verwendet, wo Fluchten aus dem Typ-System notwendig sein können. Der Bearbeiter versucht, Typ-Genauigkeit von den meisten Ausdrücken zu sichern, aber der Programmierer kann die Check-Ins verschiedener Wege überreiten, entweder indem er einen Typ-Wurf verwendet, um einen Wert von einem Typ bis einen anderen ausführlich umzuwandeln, oder indem er Zeigestöcke oder Vereinigungen verwendet, um die zu Grunde liegenden Bit eines Datengegenstands auf eine andere Weise wiederzuinterpretieren.

Zeigestöcke

C unterstützt den Gebrauch von Zeigestöcken, einen Typ der Verweisung, die die Adresse oder Position eines Gegenstands oder Funktion im Gedächtnis registriert. Zeigestöcke können dereferenced sein, um auf Daten zuzugreifen, die an der Adresse versorgt sind, die angespitzt ist auf, oder einen spitzen anzurufen - um zu fungieren. Zeigestöcke können mit der Anweisung oder Zeigestock-Arithmetik manipuliert werden. Die Laufzeitdarstellung eines Zeigestock-Werts ist normalerweise eine rohe Speicheradresse (vielleicht vermehrt durch ein Feld des Ausgleichs innerhalb des Wortes), aber da ein Typ eines Zeigestocks den Typ des Dings einschließt, das darauf angespitzt ist, können Ausdrücke einschließlich Zeigestöcke während der Übersetzung Typ-kariert sein. Zeigestock-Arithmetik wird durch die Größe des spitzen - zum Datentyp automatisch erklettert. (Sieh Auswechselbarkeit des Reihe-Zeigestocks unten.) Zeigestöcke werden zu vielen verschiedenen Zwecken in C verwendet. Textschnuren werden mit Zeigestöcken in die Reihe von Charakteren allgemein manipuliert. Dynamische Speicherzuteilung wird mit Zeigestöcken durchgeführt. Viele Datentypen, wie Bäume, werden als dynamisch zugeteilte Gegenstände verbunden zusammen mit Zeigestöcken allgemein durchgeführt. Zeigestöcke zu Funktionen sind nützlich, um Funktionen als Argumente für höherwertige Funktionen (wie qsort oder bsearch) oder als von Ereignis-Dressierern anzurufende Rückrufaktionen zu passieren.

Ein ungültiger Zeigestock-Wert weist ausführlich zu keiner gültigen Position hin. Dereferencing ein ungültiger Zeigestock-Wert ist unbestimmt, häufig auf eine Segmentationsschuld hinauslaufend. Ungültige Zeigestock-Werte sind nützlich, um spezielle Fälle wie kein "folgender" Zeigestock im Endknoten einer verbundenen Liste, oder als eine Fehleranzeige von Funktionen anzuzeigen, Zeigestöcke zurückgebend. In passenden Zusammenhängen im Quellcode, solcher bezüglich des Zuweisens einer Zeigestock-Variable, kann ein ungültiger unveränderlicher Zeigestock als, mit oder ohne ausführliches Gussteil zu einem Zeigestock-Typ, oder als das durch mehrere Standardkopfbälle definierte Makro geschrieben werden. In bedingten Zusammenhängen bewerten ungültige Zeigestock-Werte zum falschen, während alle anderen Zeigestock-Werte zum wahren bewerten.

Leere Zeigestöcke weisen zu Gegenständen des unangegebenen Typs hin, und können deshalb als "allgemeine" Datenzeigestöcke verwendet werden. Seit der Größe und dem Typ des spitzen - um zu protestieren, ist nicht bekannt, leere Zeigestöcke können nicht dereferenced sein, noch sind Zeigestock-Arithmetik auf ihnen erlaubt, obwohl sie leicht sein können (und in vielen Zusammenhängen implizit sind) umgewandelt zu und von jedem anderen Gegenstand-Zeigestock-Typ.

Der unbesonnene Gebrauch von Zeigestöcken ist potenziell gefährlich. Weil sie normalerweise ungehemmt sind, kann eine Zeigestock-Variable gemacht werden, zu jeder willkürlichen Position hinzuweisen, die unerwünschte Effekten verursachen kann. Obwohl richtig verwendete Zeigestöcke zu sicheren Plätzen hinweisen, können sie gemacht werden, zu unsicheren Plätzen hinzuweisen, indem sie ungültige Zeigestock-Arithmetik verwenden; die Gegenstände, zu denen sie hinweisen, können deallocated und wiederverwendet (baumelnde Zeigestöcke) sein; sie können verwendet werden, ohne (wilde Zeigestöcke) initialisiert worden zu sein; oder sie können ein unsicherer Wert mit einem Wurf, Vereinigung, oder durch einen anderen korrupten Zeigestock direkt zugeteilt werden. Im Allgemeinen ist C im Erlauben der Manipulation und Konvertierung zwischen Zeigestock-Typen permissiv, obwohl Bearbeiter normalerweise Optionen für verschiedene Niveaus der Überprüfung zur Verfügung stellen. Einige andere Programmiersprachen richten diese Probleme durch das Verwenden einschränkenderer Bezugstypen.

Reihe

Reihe-Typen in C sind traditionell einer festen, statischen Größe angegeben während der Übersetzung. (Der neuere C99 Standard erlaubt auch eine Form der Reihe der variablen Länge.) Jedoch ist es auch möglich, einen Block des Gedächtnisses (der willkürlichen Größe) an der Durchlaufzeit mit der Funktion der Standardbibliothek zuzuteilen, und es als eine Reihe zu behandeln. Die Vereinigung von C der Reihe und Zeigestöcke bedeutet (sieh unten), dass erklärt Reihe und diese dynamisch zugeteilte vorgetäuschte Reihe eigentlich austauschbar sind. Da auf Reihe immer (tatsächlich) über Zeigestöcke zugegriffen wird, werden Reihe-Zugänge normalerweise gegen die zu Grunde liegende Reihe-Größe nicht überprüft, obwohl einige Bearbeiter Grenzen zur Verfügung stellen können, die als eine Auswahl überprüfen. Reihe-Grenze-Übertretungen sind deshalb möglich und im unbesonnen geschriebenen Code ziemlich üblich, und können zu verschiedenen Rückschlägen, einschließlich ungesetzlicher Speicherzugänge, Bestechung von Daten führen, Puffer, überflutet und Laufzeitausnahmen.

C hat keine spezielle Bestimmung, um mehrdimensionale Reihe zu erklären, aber verlässt sich eher auf recursion innerhalb des Typ-Systems, um Reihe der Reihe zu erklären, der effektiv dasselbe Ding vollbringt. Von den Index-Werten der resultierenden "mehrdimensionalen Reihe" kann als zunehmend in der mit der Reihe größeren Ordnung gedacht werden.

Mehrdimensionale Reihe wird in numerischen Algorithmen (hauptsächlich von der angewandten geradlinigen Algebra) allgemein verwendet, um matrices zu versorgen. Der Struktur der C-Reihe wird dieser besonderen Aufgabe gut angepasst. Jedoch, da Reihe bloß als Zeigestöcke passiert wird, müssen die Grenzen der Reihe befestigte Werte bekannt sein, oder ausführlich passiert zu jedem Unterprogramm, das sie und dynamisch nach Größen geordnete Reihe der Reihe verlangt, mit dem doppelten Indexieren nicht zugegriffen werden kann. (Ein workaround dafür soll die Reihe mit einem zusätzlichen "Zeilenvektoren" von Zeigestöcken zu den Säulen zuteilen.)

C99 hat "Reihe der variablen Länge" eingeführt, die einige, aber nicht alle von den Problemen mit der gewöhnlichen C-Reihe anredet.

Auswechselbarkeit des Reihe-Zeigestocks

Ein kennzeichnender (aber potenziell verwirrend) Eigenschaft von C ist seine Behandlung der Reihe und Zeigestöcke. Die Notation der Reihe-Subschrift kann auch verwendet werden, wenn ein Zeigestock ist; die Interpretation (Zeigestock-Arithmetik verwendend), soll auf den th Gegenstand von mehreren angrenzenden Datengegenständen zugreifen, die angespitzt sind auf durch, den Gegenstand aufzählend, der zu hinweist (der ist) als das erste Element der Reihe.

Formell, ist dazu gleichwertig. Da der Typ des beteiligten Zeigestocks dem Bearbeiter während der Übersetzung bekannt ist, ist die Adresse, die dazu hinweist, nicht die Adresse hat zu durch den erhöhten durch Bytes, aber eher erhöht durch den multiplizierten mit der Größe eines Elements hingewiesen, das dazu hinweist. Die Größe dieser Elemente kann mit dem Maschinenbediener durch die Verwendung davon auf jedes dereferenced Element, als in bestimmt werden oder.

Außerdem, in den meisten Ausdruck-Zusammenhängen (ist eine bemerkenswerte Ausnahme als operand von), wird der Name einer Reihe zu einem Zeigestock zum ersten Element der Reihe automatisch umgewandelt; das deutet an, dass eine Reihe, als Ganzes wenn genannt, als ein Argument für eine Funktion nie kopiert wird, aber ziemlich nur die Adresse seines ersten Elements wird passiert. Deshalb, obwohl Funktion C-Gebrauch-Vorbeigehen-Wert-Semantik herbeiruft, wird Reihe tatsächlich durch die Verweisung passiert.

Die Zahl der Elemente in einer offen erklärten Reihe kann als bestimmt werden.

Eine Demonstration der Auswechselbarkeit von Zeigestöcken und Reihe wird unten gezeigt. Die vier Anweisungen sind gleichwertig, und jeder ist gültiger C-Code.

/* x ist eine Reihe ODER ein Zeigestock. ich bin eine ganze Zahl. * /

x [ich] = 1;/*, der zu * (x + i) * / gleichwertig

ist
  • (x + i) = 1;
  • (ich + x) = 1;

ich [x] = 1;/*, der zu * (ich + x) * / gleichwertig

ist</syntaxhighlight>

Bemerken Sie, dass, obwohl alle vier Anweisungen nur gleichwertig sind, das erste guten Codierstil vertritt. Die letzte Linie könnte im verfinsterten C-Code gefunden werden.

Trotz dieser offenbaren Gleichwertigkeit zwischen Reihe und Zeigestock-Variablen gibt es noch eine zwischen ihnen zu machende Unterscheidung. Wenn auch der Name einer Reihe in den meisten Ausdruck-Zusammenhängen ist, die in einen Zeigestock umgewandelt sind (zu seinem ersten Element), besetzt dieser Zeigestock keine Lagerung verschieden von einer Zeigestock-Variable selbst. Folglich weist welche Reihe "zu hin" kann nicht geändert werden, und es ist unmöglich, einen Wert einer Reihe-Variable zuzuteilen. (Reihe-Inhalt, kann jedoch, durch das Verwenden der Funktion, oder durch das Zugreifen auf die individuellen Elemente kopiert werden.)

Speichermanagement

Eine der wichtigsten Funktionen einer Programmiersprache soll Möglichkeiten für das Betriebsgedächtnis und die Gegenstände zur Verfügung stellen, die im Gedächtnis versorgt werden. C stellt drei verschiedene Weisen zur Verfügung, Gedächtnis für Gegenstände zuzuteilen:

  • Zuteilung des statischen Speichers: Der Raum für den Gegenstand wird in der Dualzahl während der Übersetzung geboten; diese Gegenstände haben ein Ausmaß (oder Lebenszeit) als lange als die Dualzahl, die sie enthält, wird ins Gedächtnis geladen.
  • Automatische Speicherzuteilung: Vorläufige Gegenstände können auf dem Stapel versorgt werden, und dieser Raum wird automatisch befreit und nach dem Block wiederverwendbar, in dem sie erklärt werden, wird geherrscht
  • Dynamische Speicherzuteilung: Blöcke des Gedächtnisses der willkürlichen Größe können an Laufzeitverwenden-Bibliotheksfunktionen solcher gebeten werden, wie von einem Gebiet des Gedächtnisses den Haufen genannt hat; diese Blöcke, dauern bis nachher befreit, für den Wiedergebrauch durch das Benennen der Bibliotheksfunktion oder des an

Diese drei Annäherungen sind in verschiedenen Situationen passend und haben verschiedene Umtausche. Zum Beispiel hat Zuteilung des statischen Speichers wenig Zuteilung oberirdische, automatische Zuteilung kann mit ein bisschen mehr oberirdischer und dynamischer Speicherzuteilung verbunden sein kann sehr viel oben sowohl für die Zuteilung als auch für deallocation potenziell haben. Die beharrliche Natur von statischen Gegenständen ist nützlich, um Zustandinformation über Funktionsanrufe aufrechtzuerhalten, automatische Zuteilung ist leicht, Raum zu verwenden aber aufzuschobern, wird normalerweise viel mehr beschränkt und vergänglich entweder als der statische Speicher oder als Haufen-Raum, und dynamische Speicherzuteilung erlaubt günstige Zuteilung von Gegenständen, deren Größe nur an der Durchlaufzeit bekannt ist. Die meisten C Programme machen umfassenden Gebrauch aller drei.

Wo möglich ist automatische oder statische Zuteilung gewöhnlich am einfachsten, weil die Lagerung durch den Bearbeiter geführt wird, den Programmierer der potenziell fehlbaren lästigen Arbeit des manuellen Zuteilens und der Ausgabe der Lagerung befreiend. Jedoch können sich viele Datenstrukturen in die Größe an der Durchlaufzeit ändern, und da statische Zuteilungen (und automatische Zuteilungen vor C99) eine feste Größe während der Übersetzung haben müssen, gibt es viele Situationen, in denen dynamische Verteilung notwendig ist. Vor der C99 normalen, variable-großen Reihe waren ein allgemeines Beispiel davon. (Sieh den Artikel über für ein Beispiel der dynamisch zugeteilten Reihe.) Verschieden von der automatischen Zuteilung, die in der Durchlaufzeit mit nicht kontrollierten Folgen scheitern kann, geben die Funktionen der dynamischen Verteilung eine Anzeige zurück (in der Form eines ungültigen Zeigestock-Werts), wenn die erforderliche Lagerung nicht zugeteilt werden kann. (Statische Zuteilung, die zu groß ist, wird gewöhnlich durch den linker oder Lader entdeckt, bevor das Programm sogar Ausführung beginnen kann.)

Wenn sonst nicht angegeben, enthalten statische Gegenstände ungültige oder Nullzeigestock-Werte nach dem Programm-Anlauf. Automatisch und werden dynamisch zugeteilte Gegenstände nur initialisiert, wenn ein Anfangswert ausführlich angegeben wird; sonst haben sie am Anfang unbestimmte Werte (normalerweise, was auch immer Bit-Muster zufällig in der Lagerung da ist, die keinen gültigen Wert für diesen Typ sogar vertreten könnte). Wenn das Programm versucht, auf einen uninitialisierten Wert zuzugreifen, sind die Ergebnisse unbestimmt. Viele moderne Bearbeiter versuchen, zu entdecken und über dieses Problem zu warnen, aber sowohl falscher positives als auch falsche Negative können vorkommen.

Ein anderes Problem ist, dass Haufen-Speicherzuteilung mit seinem wirklichen Gebrauch in jedem Programm in der Größenordnung davon synchronisiert werden muss, um so viel wie möglich wiederverwendet zu werden. Zum Beispiel, wenn der einzige Zeigestock zu einer Haufen-Speicherzuteilung aus dem Spielraum geht oder seinen Wert überschreiben ließ, bevor genannt wird, dann kann dieses Gedächtnis nicht für den späteren Wiedergebrauch wieder erlangt werden und wird im Wesentlichen gegen das Programm, ein als eine Speicherleckstelle bekanntes Phänomen verloren. Umgekehrt ist es für das Gedächtnis möglich, befreit zu werden, aber fortzusetzen, Verweise angebracht zu werden, zu unvorhersehbaren Ergebnissen führend. Gewöhnlich werden die Symptome in einem Teil des vom wirklichen Fehler weit entfernten Programms erscheinen, es schwierig machend, das Problem ausfindig zu machen. (Solche Probleme werden auf Sprachen mit der automatischen Müll-Sammlung verbessert.)

Bibliotheken

Die C Programmiersprache verwendet Bibliotheken als seine primäre Methode der Erweiterung. In C ist eine Bibliothek eine Reihe von innerhalb einer einzelnen "Archiv"-Datei enthaltenen Funktionen. Jede Bibliothek hat normalerweise eine Kopfball-Datei, die die Prototypen der Funktionen enthält, die innerhalb der Bibliothek enthalten sind, die durch ein Programm und Behauptungen von speziellen Datentypen und mit diesen Funktionen verwendeten Makrosymbolen verwendet werden kann. In der Größenordnung von einem Programm, um eine Bibliothek zu verwenden, muss es die Kopfball-Datei der Bibliothek einschließen, und die Bibliothek muss mit dem Programm verbunden werden, das in vielen Fällen Bearbeiter-Fahnen (z.B, Schnellschrift für die "Mathebibliothek") verlangt.

Die allgemeinste C Bibliothek ist die C Standardbibliothek, die durch den ISO und ANSI C Standards angegeben wird und mit jeder C Durchführung kommt. ("Freistehende" C Durchführungen, die eingebettete Systeme ins Visier nehmen, können nur eine Teilmenge der Standardbibliothek zur Verfügung stellen.) Diese Bibliothek unterstützt Strom-Eingang und Produktion, Speicherzuteilung, Mathematik, Charakter-Schnuren und Zeitwerte. Mehrere getrennte Standardkopfbälle (zum Beispiel,) geben die Schnittstellen für diese und anderen Standardbibliotheksmöglichkeiten an.

Ein anderes Standardset von C Bibliotheksfunktionen ist diejenigen, die durch Anwendungen spezifisch verwendet sind, die für Systeme von Unix und Unix-like, besonders Funktionen ins Visier genommen sind, die eine Schnittstelle dem Kern zur Verfügung stellen. Über diese Funktionen wird in verschiedenen Standards wie POSIX und die Einzelne UNIX Spezifizierung ausführlich berichtet.

Seitdem viele Programme in C geschrieben worden sind, gibt es ein großes Angebot an anderen verfügbaren Bibliotheken. Bibliotheken werden häufig in C geschrieben, weil C Bearbeiter effizienten Gegenstand-Code erzeugen; Programmierer schaffen dann Schnittstellen zur Bibliothek, so dass die Routinen aus Sprachen des höheren Niveaus wie Java, Perl und Pythonschlange verwendet werden können.

Sprachwerkzeuge

Werkzeuge sind geschaffen worden, um C Programmierern zu helfen, einige der Probleme zu vermeiden, die der Sprache, wie Behauptungen mit dem unbestimmten Verhalten oder Behauptungen innewohnend sind, die nicht eine gute Praxis sind, weil sie wahrscheinlich auf unbeabsichtigtes Verhalten oder Laufzeitfehler hinauslaufen werden.

Automatisierte Quellcodeüberprüfung und Rechnungsprüfung sind auf jeder Sprache vorteilhaft, und für C bestehen viele solche Werkzeuge wie Scharpie. Eine übliche Praxis soll Scharpie verwenden, um zweifelhaften Code zu entdecken, wenn ein Programm zuerst geschrieben wird. Sobald ein Programm Scharpie passiert, wird es dann mit dem C Bearbeiter kompiliert. Außerdem können viele Bearbeiter über syntaktisch gültige Konstruktionen fakultativ warnen, die wahrscheinlich wirklich Fehler sein werden. MISRA C ist ein Eigentumssatz von Richtlinien, um solchen zweifelhaften Code zu vermeiden, der für eingebettete Systeme entwickelt ist.

Es gibt auch Bearbeiter, Bibliotheken und Betriebssystemniveau-Mechanismen, um Handlungen durchzuführen, die nicht ein Standardteil von C, wie Reihe-Grenze-Überprüfung, Pufferüberschwemmungsentdeckung, Anordnung und automatische Müll-Sammlung sind.

Werkzeuge wie Purify oder Valgrind und Verbindung mit Bibliotheken, die spezielle Versionen der Speicherzuteilungsfunktionen enthalten, können helfen, Laufzeitfehler im Speichergebrauch aufzudecken.

Zusammenhängende Sprachen

C hat viele spätere Sprachen solcher direkt oder indirekt beeinflusst, als C#, D Programmiersprache, Java, JavaScript, Vorhölle, LPC, Perl, PHP, Pythonschlange und C Shell von Unix Gehen Sie. Der durchdringendste Einfluss ist syntaktisch gewesen: Alle Sprachen haben erwähnt verbinden die Behauptung und (mehr oder weniger erkennbar) Ausdruck-Syntax von C mit Typ-Systemen, Datenmodellen und/oder groß angelegten Programm-Strukturen, die sich von denjenigen von C manchmal radikal unterscheiden.

Mehrere C oder nahe - C Dolmetscher, bestehen einschließlich Ch und CINT, der auch für scripting verwendet werden kann.

Als objektorientierte Sprachen populär geworden sind, waren C ++ und Ziel-C zwei verschiedene Erweiterungen von C, der objektorientierte Fähigkeiten zur Verfügung gestellt hat. Beide Sprachen wurden als Quelle-zu-Quelle-Bearbeiter ursprünglich durchgeführt; Quellcode wurde in C übersetzt, und dann mit einem C Bearbeiter kompiliert.

Der C ++ Programmiersprache wurde von Bjarne Stroustrup als eine Annäherung an das Versorgen objektorientierter Funktionalität mit der C ähnlichen Syntax ausgedacht. C ++ fügt größere tippende Kraft, scoping, und andere Werkzeuge hinzu, die in der objektorientierten Programmierung nützlich sind, und erlaubt allgemeine Programmierung über Schablonen. Fast eine Obermenge von C, C ++ unterstützt jetzt die meisten C mit einigen Ausnahmen (sieh Vereinbarkeit von C und C ++).

Ziel-C war ursprünglich eine "sehr dünne" Schicht oben auf C, und bleibt eine strenge Obermenge von C, der objektorientierte Programmierung mit einem hybriden dynamischen/statischen tippenden Paradigma erlaubt. Ziel-C leitet seine Syntax sowohl von C als auch von Plausch ab: Syntax, die Aufbereitung, Ausdrücke, Funktionsbehauptungen und Funktionsanrufe einschließt, wird von C geerbt, während die Syntax für objektorientierte Eigenschaften vom Plausch ursprünglich genommen wurde.

Zusätzlich zu C ++ und Ziel-C sind Ch, Cilk und Unified Parallel C fast Obermengen von C.

Siehe auch

Zeichen

Weiterführende Literatur

Links

häufig gestellte

Unfall (Roman von J. G. Ballard) / Zytologie
Impressum & Datenschutz