Frage

Ich weiß, Sie können nur ein paar Zahlen #define, aber warum nicht C haben einen eigenen Typ boolean Daten vor C99?

Es ist so ein gemeinsames Auftreten in der Programmierung und Logik verstehe ich nicht die Abwesenheit einer expliziten Art und Notation.

War es hilfreich?

Lösung

Wenn Sie ein wenig Zeit in der Bibliothek verbringen, Sie müssen nicht spekulieren. Hier sind einige Aussagen gemacht von Dennis Ritchie Papier über die Entwicklung von C . Der Kontext ist, dass Dennis baut auf Ken Thompson Sprache B, die auf der sehr kleinen PDP-7, ein Wort adressierten Maschine umgesetzt wurden. Aufgrund des wachsenden Interesses, bekam die Gruppe eine der ersten PDP-11s. Dennis schreibt,

  

Das Aufkommen der PDP-11 ausgesetzt mehrere Unzulänglichkeiten des semantischen Modells B. Erstens, seine Charakter Behandlungsmechanismen, mit wenigen Änderungen von BCPL geerbt, waren plump: Bibliothek Verfahren mit gepackten Strings in einzelne Zellen zu verbreiten und dann einpacken, oder für den Zugriff auf und einzelne Zeichen zu ersetzen, begann umständlich zu fühlen, auch albern, auf einem byteorientierte Maschine.

     

Der B und BCPL Modell implizierte Kopf mit Zeigern im Umgang: die Sprachregeln, indem sie in einer Reihe von Worten einen Zeiger als Index definiert, gezwungen Zeiger als Wortindizes vertreten zu sein. Jeder Zeiger Referenz eine Laufzeitskala Umwandlung von dem Zeiger auf die Byte-Adresse, die durch die Hardware erwartet.

     

Aus all diesen Gründen schien es, dass ein Schreibschema notwendig war, mit Zeichen zu bewältigen und Byte-Adressierung, und für die kommende Gleitkomma-Hardware herzustellen. Weitere Themen, insbesondere Typ Sicherheit und Schnittstellenkontrolle, schien nicht so wichtig, dann, wie sie später.

(Hervorhebung von mir).

Das Papier geht auf Dennis Kämpfe beschreiben einen neuen Zeiger Semantik zu erfinden, um Arrays arbeiten und sich mit diesem neumodischen struct Idee zu kommen. Vorstellungen vom Typ Sicherheit und Unterscheidung Booleans von ganzen Zahlen nicht wichtig erschienen erst viel später: -)

Andere Tipps

C ist eigentlich nicht viel mehr als ein übergeordnetes Assemblersprache. Ja, es bekam Kontrollstrukturen und so weiter und es wurde auch Typen, die Assembler sicherlich nicht brauchen.

Aber die Sprache Jahrzehnte wurde entwickelt, vor. Und da jedes boolean Ergebnis wird auf einzelne Bits nach unten im Statuswort des Prozessors war es offensichtlich ausreichend, um nur einen integralen Datentyp für ihn verwenden. Und es machte den Compiler wahrscheinlich etwas weniger komplex, da Sie einige Typprüfung auslassen kann (in späteren Sprachen Kontrollstrukturen Notwendigkeit ein Boolescher Wert, in C sie nur einen ganzzahligen Wert von 0 oder etwas anderes brauchen) .

Es war üblich (und ist immer noch in einigen Fällen) Null als falsch und jede Nicht-Null als wahr zu behandeln. Dies hat Vorteile für Stenografie. B. statt while (remaining != 0) Sie nur while (remaining) verwenden

Einige Sprachen auf wahre Wesen standardisiert -1. Der Grund dafür ist, dass in Zweierkomplement-Notation (die meisten Computer negative Zahlen darzustellen verwenden), die bitweise nicht von 0 -1 (in 8-Bit binär, 11111111 ist dezimal -1).

Im Laufe der Zeit wurde erkannt, dass ein Compiler definierte Konstante verwendet würde eine Menge möglicher Verwirrung vermeiden. Es ist schon eine Weile her, seit ich C ++ gemacht habe, aber ich bin ziemlich sicher, dass jeder Nicht-Null-Wert wird nach wie vor „true“ bewerten.

Eine CPU hat keine „boolean Typ“, sie nur auf Bytes und Multiples von ihnen arbeiten so ein Typ boolean zu diesem Zeitpunkt keinen Sinn, da es nicht einen Vorteil haben (warum eine Art verwenden, wenn Sie nur können überprüfen " 0" oder "nicht null")

ist

Ich vermute, es war, als ausreichend für eine ganze Zahl Typ zu haben, mit 0 falsch und nichts 0 wahr zu sein.

Der Typ Sie einen Booleschen speichern (in der Regel) verkörpert einen Kompromiss zwischen Raum und Zeit. Sie werden in der Regel die schnellsten Ergebnisse (zumindest für einen einzelnen Betrieb) erhalten, indem ein int (normalerweise vier Bytes). Auf der anderen Seite, wenn Sie sehr viele verwenden, kann es viel mehr Sinn machen, ein Byte zu verwenden oder sie sogar packen, so dass jeder Wert, den Sie verwendet nur ein einzelnes Bit sind speichern - aber wenn / falls Sie das tun, Lesen oder ein einzelnes Bit wird wesentlich teurer zu schreiben (und verwendet Zusatz).

Da es keine eine Antwort, die wirklich „richtig“ war, verließ sie die Entscheidung für den Benutzer basierend auf den Anforderungen des Programms machen sie schreiben.

Die eigentliche Frage ist also, warum ein Typ Boolean in C99 aufgenommen. Meine Vermutung ist, dass ein paar Faktoren beteiligt sind. Zuerst erkannten sie, dass die Lesbarkeit und Komfort für den Programmierer jetzt in der Regel wichtiger als die absolute beste Leistung. Zweitens Compiler tun jetzt ziemlich viel mehr globale Analyse, so ist es zumindest möglich zu erraten ist, dass jemand könnte einen Compiler schreiben, die eine Darstellung zu holen versucht, die für ein bestimmtes Programm am besten geeignet ist (obwohl ich don‘ t wissen, dass das wirklich der Fall ist).

Alt C war nicht wirklich „fehlenden“ einen Booleschen Typ - es war nur, dass alle der integralen Typen auch dafür doppelt Pflicht, Lagerung booleans geeignet angesehen wurden. Ich kann zwei Hauptgründe dafür sehen:

  • Bit-Adressierung Prozessoren waren nicht üblich (und sind immer noch nicht), so würde der Compiler nicht wirklich einen „true boolean“ Typen verwenden, um jeden Platz zu sparen - die boolean würde nach wie vor mindestens so groß wie ein char sowieso (wenn man es effizient zugreifen zu hoffen).

  • Typen schmaler als int erweitert werden ohnehin in Ausdrücken int -., So dass die Booleschen Operatoren würden immer noch auf int Operanden arbeiten

.. so sieht es aus wie es keine zwingend genug Fall, dass ein dedizierter boolean Typ war wirklich praktischen Nutzen vermitteln würde.

Beachten Sie, dass die C-Sprache eine Reihe von Operatoren hat, die boolean Ergebnisse produzieren (definiert werden entweder 0 oder 1) - !, &&, ||, !=, ==, <, <=, > und >= - so ist es nur eine dedizierter boolean Typ, der nicht da ist.

Historische Gründe, wahrscheinlich:

CPL, die von Algol stark beeinflusst wurde, höchstwahrscheinlich einen Booleschen Typen hatte, aber mein Google-Fu genügte nicht, eine Referenz für diese zu finden. Aber CPL war zu ehrgeizig für seine Zeit, was zu einer abgespeckten Version BCPL genannt, was den Vorteil hatte, dass Sie tatsächlich auf verfügbare Hardware implementieren könnten.

BCPL hatte nur einen einzigen Typ - das ‚Wort‘ - die als falsch in boolean Kontexten wenn 0 und als wahr, wenn ~0 (dh das Komplement 0 interpretiert wurde, die den Wert -1 als signierte Zweier-Komplement, wenn interpretiert darstellen würde ganze Zahl). Die Interpretation eines anderen Wertes war die Umsetzung abhängig.

Nach dem noch typenlos Nachfolger B, wieder eingeführt C ein Typ-System, aber es war immer noch von der typenlos Natur seiner Vorgänger stark beeinflusst.

einen separaten Typ „Boolean“ Hinzufügen, die nicht kompatibel ist mit ganzen Zahlen der Compiler komplizierter als einfach unter Verwendung von ganzen Zahlen zum Zweck gemacht hätte. einen separaten Booleschen Typ, der mit ganzen Zahlen kompatibel ist, macht es notwendig, die möglichen Folgen des Speicherns einen anderen Wert als 0 angeben oder 1 in ein Booleschen Objekt oder Durchführen numerische Berechnungen auf einer Booleschen Objekt, dessen Darstellung enthält weder das Bitmuster zugeordnet ist "0" noch "1". Gegeben:

someBool = intFunction();
someInt = someBool;

, dass someInt erfordern, müssen Sie den Wert 1 erhalten, wenn intFunction gibt jeden Wert ungleich Null im Allgemeinen die oben teurer als

machen würde
someChar = intFunction();
someInt = someChar;

In Fällen, in denen die früheren Semantik erforderlich wäre, könnten sie ohne die Verwendung eines Booleschen Typs erreicht werden, über:

someChar = !!intFunction();
someInt = someChar;

Da alles, was Boolesche Typen getan werden kann, indem auch ohne sie getan werden kann, und in vielen Fällen Code die Zeichentypen verwendet, kann effizienter sein als Boolesche Typen, würde ich vorschlagen, dass es nie (und ist immer noch nicht ) eine wirkliche Notwendigkeit für sie.

Weil sie nicht ein gelegt hat in. Sorry, wenn das klingt snippish, aber im Grunde war es nicht als solche definiert sind.

Denken Sie daran, die meisten Menschen #define TRUE und FALSE.

Sie können sagen Bool Standard IS - aber natürlich Standard, es war nicht vor dem C99 -, die vor 10 Jahren gemacht wurde;) Sie fügten hinzu, es dann, wenn es ein fehlendes Element offensichtlich wurde,

.

Da kein alles, einschließlich fehlendem Datentypen in einem Programmiersprache voraussehen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top