tech - zone-c




Was macht das C ??! ??! Betreiber tun? (3)

Es ist ein C- trigraph . ??! ist | , so ??!??! ist der Operator ||

Ich sah eine Linie von C, die so aussah:

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

Es kompiliert korrekt und scheint in Ordnung zu sein. Es scheint, als ob es überprüft, ob ein Fehler aufgetreten ist, und wenn es ist, behandelt es es. Aber ich bin mir nicht sicher, was es eigentlich macht oder wie es geht. Es sieht so aus, als ob der Programmierer versucht, seine Gefühle über Fehler auszudrücken.

Ich habe noch nie das ??!??! vorher in irgendeiner Programmiersprache, und ich kann nirgendwo Dokumentation dafür finden. (Google hilft nicht bei Suchbegriffen wie ??!??! ). Was macht es und wie funktioniert das Codebeispiel?


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

Alles begann vor einem halben Jahrhundert mit der Umnutzung von Hardcopy-Kommunikationsendgeräten als Computer-Benutzerschnittstellen. In der ersten Unix- und C-Ära war das der ASR-33 Teletype.

Dieses Gerät war langsam (10 cps) und laut und hässlich und seine Sicht auf den ASCII-Zeichensatz endete bei 0x5f, also hatte es (siehe genaues Bild) keine der Tasten:

{ | } ~ 

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

Ihr Beispiel ist eigentlich zwei von ??! , jede Bedeutung | Also ist das Ergebnis || .

Allerdings haben Leute, die C-Code fast per definitionem schreiben, moderne Ausrüstung, 1 also meine Vermutung ist: jemand zeigt oder amüsiert sich selbst, hinterlässt eine Art Osterei im Code für Sie zu finden.

Es hat sicher funktioniert, es hat zu einer sehr populären SO Frage geführt.

ASR-33 Fernschreiber

1. Die Trigraphen wurden von dem ANSI-Komitee erfunden, das erst nach C zu einem außer Kontrolle geratenen Erfolg wurde, so dass keiner der ursprünglichen C-Codes oder Kodierer sie benutzt hätte.


??! ist ein trigraph , der in | übersetzt wird . So heißt es:

!ErrorHasOccured() || HandleError();

was aufgrund eines Kurzschlusses entspricht:

if (ErrorHasOccured())
    HandleError();

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

Möglicher Ursprung von Trigraphen oder als @DwB weist in den Kommentaren darauf hin, dass EBCDIC (wieder) schwierig ist. This Diskussion auf der IBM Entwicklerwerkstatt 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 nicht im Invariant Code Set definiert sind, wie in ISO / IEC 646 beschrieben, die eine Teilmenge des Sieben-Bit-US-ASCII-Code-Satzes ist.





trigraphs