Was sind die Hauptunterschiede zwischen ANSI C und K&R C?

Lesezeit: 5 Minuten

Benutzeravatar von Thomas Owens
Thomas Owens

Das Wikipedia-Artikel zu ANSI C sagt:

Eines der Ziele des ANSI-C-Standardisierungsprozesses bestand darin, eine Obermenge von K&R C (dem ersten veröffentlichten Standard) zu erstellen, die viele der später eingeführten inoffiziellen Merkmale enthält. Das Standardisierungskomitee hat jedoch auch mehrere neue Funktionen aufgenommen, wie z. B. Funktionsprototypen (aus der Programmiersprache C++ entlehnt) und einen leistungsfähigeren Präprozessor. Die Syntax für Parameterdeklarationen wurde ebenfalls geändert, um den C++-Stil widerzuspiegeln.

Das lässt mich vermuten, dass es Unterschiede gibt. Ich habe jedoch keinen Vergleich zwischen K&R C und ANSI C gesehen. Gibt es ein solches Dokument? Wenn nicht, was sind die Hauptunterschiede?

EDIT: Ich glaube, das K & R-Buch sagt “ANSI C” auf dem Cover. Zumindest glaube ich, dass die Version, die ich zu Hause habe, das tut. Also gibt es vielleicht keinen Unterschied mehr?

  • Ihr Buch ist die zweite Ausgabe von K&R; wenn K&R C erwähnt wird, bedeutet dies das in der ersten Ausgabe beschriebene C (das als eine Art Standard diente, bevor der ANSI-Standard aufkam, die Sprache war bis dahin ziemlich weit auseinandergegangen).

    – Vonbrand

    1. Februar 2013 um 20:28 Uhr

Benutzeravatar von Chris Conway
Chris Conway

Hier kann es zu Verwirrung darüber kommen, was „K&R C“ ist. Der Begriff bezieht sich auf die Sprache, wie sie in der ersten Ausgabe von „The C Programming Language“ dokumentiert ist. Grob gesagt: die Eingabesprache des Bell Labs C-Compilers um 1978.

Kernighan und Ritchie waren am ANSI-Standardisierungsprozess beteiligt. Der “ANSI C”-Dialekt löste “K&R C” ab, und nachfolgende Ausgaben von “The C Programming Language” übernehmen die ANSI-Konventionen. „K&R C“ ist eine „tote Sprache“, abgesehen davon, dass einige Compiler immer noch Legacy-Code akzeptieren.

  • Die erste Ausgabe von K&R wurde 1978 veröffentlicht. Die C-Sprache hat sich zwischen 1969 und 1978 stark verändert.

    – Keith Thompson

    23. August 2013 um 22:22 Uhr

  • Sir, ich habe Ihrer Antwort einen Teil hinzugefügt, da ich nicht sicher war, ob ich ihn als andere Antwort hinzufügen könnte, Sie könnten ihn entfernen. Was sagen Sie dazu?

    – Suraj Jain

    17. Februar 2017 um 8:05 Uhr

Funktionsprototypen waren die offensichtlichste Änderung zwischen K&R C und C89, aber es gab noch viele andere. Auch in die Standardisierung der C-Bibliothek wurde viel Arbeit investiert. Obwohl die Standard-C-Bibliothek eine Kodifizierung der bestehenden Praxis war, hat sie kodifiziert mehrere bestehenden Praktiken, was die Sache erschwerte. PJ Plaugers Buch, Die Standard-C-Bibliothekist eine großartige Referenz und erzählt auch einige Details hinter den Kulissen von warum Die Bibliothek endete so, wie sie es tat.

Der ANSI/ISO-Standard C ist dem K&R C in vielerlei Hinsicht sehr ähnlich. Es war beabsichtigt, dass der meiste vorhandene C-Code ohne viele Änderungen auf ANSI-Compilern aufbauen sollte. Entscheidend war jedoch, dass die Semantik der Sprache in der Ära vor dem Standard für Interpretationen durch jeden Compiler-Anbieter offen war. ANSI C führte eine gemeinsame Beschreibung der Sprachsemantik ein, die alle Compiler auf die gleiche Stufe stellte. Heute, rund 20 Jahre später, ist dies leicht als selbstverständlich anzusehen, aber dies war eine bedeutende Leistung.

Wenn Sie keine Vorstandard-C-Codebasis zu pflegen haben, sollten Sie größtenteils froh sein, dass Sie sich darüber keine Gedanken machen müssen. Wenn Sie das tun – oder schlimmer noch, wenn Sie versuchen, ein altes Programm auf modernere Standards zu bringen – dann haben Sie meine Sympathien.

Es gibt einige kleinere Unterschiede, aber ich denke, spätere Ausgaben von K&R sind für ANSI C, also gibt es keinen wirklichen Unterschied mehr.
“C Classic” hatte mangels besserer Begriffe eine etwas andere Art, Funktionen zu definieren, dh

int f( p, q, r )  
int p, float q, double r;  
{  
    // Code goes here  
}

Ich glaube, der andere Unterschied waren Funktionsprototypen. Prototypen mussten keine Liste von Argumenten oder Typen annehmen – sie konnten es tatsächlich nicht. In ANSI C tun sie es.

  • Streng genommen ist “Prototyp” per Definition eine Funktionsdeklaration mit explizit typisierten Parametern. Diese alten Deklarationen im K&R-Stil waren/sind nicht Prototypen.

    – AnT steht zu Russland

    27. Oktober 2009 um 13:53 Uhr

  • Das ist kein gültiges K&R 🙂 Es würde gehen int p; float q; double r; oder int p, q, r;

    – Seva Alexejew

    5. Juli 2016 um 23:02 Uhr


Benutzeravatar von vivek shukla
vivek shukla

  1. Funktionsprototyp.
  2. Konstante und flüchtige Qualifizierer.
  3. breite Charakterunterstützung und Internationalisierung.
  4. ermöglicht die Verwendung des Funktionszeigers ohne Dereferenzierung.

Ein weiterer Unterschied besteht darin, dass Funktionsrückgabetypen und Parametertypen nicht definiert werden mussten. Es wird davon ausgegangen, dass sie ints sind.

f(x)
{
    return x + 1;
}

und

int f(x)
int x;
{
    return x + 1;
}

sind identisch.

  • ANSI C erlaubt weiterhin die Eingabe von “default int”.

    – Corey D

    2. September 2009 um 16:34 Uhr

bolovs Benutzeravatar
Bolov

Die Hauptunterschiede zwischen ANSI C und K&R C sind wie folgt:

  • Funktions-Prototyping
  • Unterstützung der Datentypqualifizierer const und volatile
  • Unterstützung breiter Charaktere und Internationalisierung
  • ermöglichen die Verwendung von Funktionszeigern ohne Dereferenzierung

ANSI C übernimmt die C++-Funktionsprototyptechnik, bei der Funktionsdefinition und -deklaration Funktionsnamen, Datentypen von Argumenten und Datentypen von Rückgabewerten enthalten. Funktionsprototypen ermöglichen es dem ANSI-C-Compiler, nach Funktionsaufrufen in Benutzerprogrammen zu suchen, die eine ungültige Anzahl von Argumenten oder inkompatible Argumentdatentypen übergeben. Diese beheben die Hauptschwäche des K&R-C-Compilers.

Beispiel: to deklariert eine Funktion foo und erfordert, dass foo zwei Argumente hat

 unsigned long foo (char* fmt, double data)
 {
      /*body of foo */
 }

  • ANSI C erlaubt weiterhin die Eingabe von “default int”.

    – Corey D

    2. September 2009 um 16:34 Uhr

Benutzeravatar von VISHNU CHOUDHARY
VISHNU CHUDHARY

  • FUNKTIONSPROTOTYPING: ANSI C übernimmt die C++-Funktionsprototyptechnik, bei der die Funktionsdefinition und -deklaration Funktionsnamen, Argumente, Datentypen und Rückgabewertdatentypen enthält. Der Funktionsprototyp ermöglicht es ANSI-Compilern, nach Funktionsaufrufen im Benutzerprogramm zu suchen, die eine ungültige Anzahl von Argumenten übergeben oder inkompatible Argumentdatentypen. Diese beheben eine Hauptschwäche der K&R-C-Compiler: Ungültige Aufrufe im Benutzerprogramm bestehen häufig die Kompilierung, führen jedoch zum Absturz des Programms, wenn sie ausgeführt werden

1407100cookie-checkWas sind die Hauptunterschiede zwischen ANSI C und K&R C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy