Frage

Ich habe eine Linie von C gesehen, die so aussah:

!ErrorHasOccured() ??!??! HandleError();

Es wurde richtig zusammengestellt und scheint in Ordnung zu laufen. Es scheint, als würde es prüfen, ob ein Fehler aufgetreten ist, und wenn dies der Fall ist, geht es um. Aber ich bin mir nicht sicher, was es tatsächlich tut oder wie es es tut. Es sieht so aus, als würde der Programmierer versuchen, ihre Gefühle zu Fehlern auszudrücken.

Ich habe das noch nie gesehen ??!??! vorher in einer Programmiersprache, und ich kann keine Dokumentation dafür finden. (Google hilft nicht bei Suchbegriffen wie ??!??!). Was macht es und wie funktioniert das Code -Beispiel?

War es hilfreich?

Lösung

??! ist ein Trigraph das übersetzt |. Also heißt es:

!ErrorHasOccured() || HandleError();

Was aufgrund des Kurzschaltungsvermögens entspricht:

if (ErrorHasOccured())
    HandleError();

Guru der Woche (befasst sich mit c ++, aber hier relevant), wo ich das aufgenommen habe.

Mögliche Herkunft von Trigraphen Oder wie @DWB in den Kommentaren betont, ist es wahrscheinlicher, dass Ebcdic (wieder) schwierig ist. Dies Die Diskussion über das IBM Developerworks Board scheint diese Theorie zu unterstützen.

Aus ISO/IEC 9899: 1999 §5.2.1.1, Fußnote 12 (h/t @random832):

Die Trigraph-Sequenzen ermöglichen die Eingabe von Zeichen, die im in ISO/IEC 646 beschriebenen Invariante-Code-Set nicht definiert sind.

Andere Tipps

Nun, warum dies im Allgemeinen existiert, ist wahrscheinlich anders als in Ihrem Beispiel.

Alles begann vor einem halben Jahrhundert mit der Umwälzung von Hardcopy -Kommunikations Terminals als Computerbenutzer -Schnittstellen. In der anfänglichen UNIX- und C-Ära war das der ASR-33-Teletyp.

Dieses Gerät war langsam (10 CPS) und laut und hässlich und seine Ansicht des ASCII -Zeichens Set endete mit 0x5f, so dass es keine der Schlüssel: Keiner der Schlüsseln angesehen hatte:

{ | } ~ 

Die Trigraphen wurden definiert, um ein bestimmtes Problem zu beheben. Die Idee war, dass C-Programme die ASCII-Untergruppe verwenden konnten, die auf dem ASR-33 gefunden wurde und in anderen Umgebungen die hohen ASCII-Werte fehlen.

Ihr Beispiel ist tatsächlich zwei von ??!, jede Bedeutung |, Das Ergebnis ist also ||.

Menschen, die C -Code schrieben, hatten jedoch fast per Definition moderne Ausrüstung.1 Also meine Vermutung ist: Jemand, der sich selbst zeigt oder amüsant, Lassen Sie eine Art Osterei im Code, das Sie finden können.

Es hat sicher funktioniert, es führte zu einer sehr beliebten Frage.

ASR-33 Teletype

ASR-33 Teletyp


1. In dieser Angelegenheit wurden die Trigraphen vom ANSI -Komitee erfunden, das erstmals traf nach C werden zu einem außer Kontrolle geratenen Erfolg, daher hätte keiner der ursprünglichen C -Code oder Codierer sie verwendet.

Es ist ein c Trigraph. ??! ist |, Also ??!??! ist der Bediener ||

Wie zuvor schon gesagt ??!??! ist im Wesentlichen zwei Trigraphen (??! und ??! wieder) zusammengeschlagen, das ersetzt wird auf ||, dh die logisch oder, durch den Präprozessor.

Die folgende Tabelle, die jedes Trigraph enthält, sollte dazu beitragen, alternative Trigraph -Kombinationen zu zerstören:

Trigraph   Replaces

??(        [
??)        ]
??<        {
??>        }
??/        \
??'        ^
??=        #
??!        |
??-        ~

Quelle: C: Ein Referenzhandbuch 5. Auflage

Also ein Trigraph, das aussieht wie ??(??) wird irgendwann zuordnen [], ??(??)??(??) wird durch ersetzt durch [][] Und so weiter bekommt man die Idee.

Da während der Vorverarbeitung Trigraphen ersetzt werden, könnten Sie verwenden cpp Um die Ausgabe selbst zu sehen, verwenden Sie eine dumme trigr.c Programm:

void main(){ const char *s = "??!??!"; } 

und verarbeiten es mit:

cpp -trigraphs trigr.c 

Sie erhalten eine Konsolenausgabe von

void main(){ const char *s = "||"; }

Wie Sie bemerken können, die Option -trigraphs muss angegeben werden oder sonst cpp wird eine Warnung ausstellen; Dies zeigt an, wie Trigraphen gehören der Vergangenheit an und keinem modernen Wert, als Menschen zu verwirren, die auf sie stoßen könnten.


Was die Begründung hinter der Einführung von Trigraphen betrifft, ist es beim Betrachten besser verstanden Der Verlaufsabschnitt von ISO/IEC 646:

ISO/IEC 646 und sein Vorgänger ASCII (ANSI X3.4) befürworteten die bestehende Praxis in Bezug auf Charaktercodierungen in der Telekommunikationsbranche weitgehend.

Da ASCII keine Reihe von Zeichen zur Verfügung stellte, die für andere Sprachen als Englisch benötigt wurden, Es wurden eine Reihe nationaler Varianten hergestellt, die einige weniger verwendete Charaktere durch die benötigten ersetzt.

(Hervorhebung meiner)

Im Wesentlichen wurden einige Zeichen (für die ein Trigraph existiert) in bestimmten nationalen Varianten ersetzt. Dies führt zu der alternativen Darstellung unter Verwendung von Trigraphen, die aus Zeichen bestehen, die andere Varianten noch hatten.

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