Ich sah eine Linie von C, die so aussah:
!ErrorHasOccured() ??!??! HandleError();
Es wurde korrekt kompiliert und scheint in Ordnung zu sein. Es scheint, als würde geprüft, ob ein Fehler aufgetreten ist, und wenn ja, wird er behandelt. 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, seine Gefühle über Fehler auszudrücken.
Ich habe das noch nie ??!??!
in einer Programmiersprache gesehen und kann nirgendwo eine Dokumentation dafür finden. (Google hilft nicht bei Suchbegriffen wie ??!??!
). Was macht es und wie funktioniert das Codebeispiel?
!ErrorHasOccurred() ??!???! HandleError();
die Kompilierung? Das ist??!
???
!
. Beweist den Punkt?ErrorHasOccured() && HandleError()
mich lieber . So macht es auch Lua.Antworten:
??!
ist ein Trigraph , der übersetzt|
. So heißt es:Dies entspricht aufgrund eines Kurzschlusses:
Guru der Woche (befasst sich mit C ++, aber hier relevant), wo ich das aufgegriffen habe.
Möglicher Ursprung von Trigraphen oder wie @DwB in den Kommentaren hervorhebt, ist es wahrscheinlicher, dass EBCDIC (wieder) schwierig ist. Diese Diskussion im IBM Developerworks Board scheint diese Theorie zu unterstützen.
Aus ISO / IEC 9899: 1999 §5.2.1.1, Fußnote 12 (h / t @ Random832):
quelle
if (ErrorHasOccured()) HandleError()
. Zum Glück begegnen Sie dieser Redewendung normalerweise nur im Perl-Code.ErrorHasOccurred() && HandleError();
, wenn Sie an Shell-Scripting gewöhnt sind. :)Nun, warum dies im Allgemeinen existiert, ist wahrscheinlich anders als in Ihrem Beispiel.
Alles begann vor einem halben Jahrhundert mit der Umnutzung von Hardcopy-Kommunikationsterminals als Computerbenutzeroberflächen. In der ersten Unix- und C-Ära war dies der ASR-33-Teletyp.
Dieses Gerät war langsam (10 cps) und laut und hässlich, und seine Ansicht des ASCII-Zeichensatzes endete bei 0x5f, sodass es (siehe Bild) keine der Tasten hatte:
Die Trigraphen wurden definiert, um ein bestimmtes Problem zu beheben. Die Idee war, dass C-Programme die ASCII-Teilmenge verwenden können, die auf dem ASR-33 und in anderen Umgebungen gefunden wurde, in denen die hohen ASCII-Werte fehlen.
Leute, die fast per Definition C-Code schreiben, hatten jedoch moderne Geräte 1, also meine Vermutung: Jemand, der sich vorführt oder amüsiert und eine Art Osterei im Code hinterlässt, das Sie finden können.
Es hat sicher funktioniert, es führte zu einer äußerst beliebten SO-Frage.
ASR-33 Teletyp
1. Im Übrigen wurden die Trigraphen vom ANSI-Komitee erfunden, das sich zum ersten Mal traf, nachdem C zu einem außer Kontrolle geratenen Erfolg geworden war, sodass keiner der ursprünglichen C-Codes oder Codierer sie verwendet hätte.
quelle
#
wurde durch ersetzt£
. In anderen Regionen hatte "ASCII" vielleicht keine Zahnspange usw.if (x || y) { a[i] = '\0'; }
, wieif (x öö y) ä aÄiÅ = 'Ö0'; å
im falschen Zeichensatz auszusehen.Es ist ein C- Trigraph .
??!
ist|
, so??!??!
ist der Betreiber||
quelle
<iso646.h>
Header-Datei.Wie bereits erwähnt,
??!??!
sind im Wesentlichen zwei Trigraphen (??!
und??!
wieder) zusammengefügt, die vom Präprozessor ersetzt und in||
das logische ODER übersetzt werden .Die folgende Tabelle mit jedem Trigraph soll helfen, alternative Trigraphkombinationen zu unterscheiden:
Quelle: C: Ein Referenzhandbuch 5. Ausgabe
Ein Trigraph, der aussieht,
??(??)
wird irgendwann zugeordnet[]
,??(??)??(??)
ersetzt durch[][]
und so weiter. Sie haben die Idee.Da Trigraphen während der Vorverarbeitung ersetzt werden, können Sie
cpp
mit einem albernentrigr.c
Programm selbst einen Überblick über die Ausgabe erhalten :und Verarbeitung mit:
Sie erhalten eine Konsolenausgabe von
Wie Sie sehen können,
-trigraphs
muss die Option angegeben werden, sonstcpp
wird eine Warnung ausgegeben. Dies zeigt, wie Trigraphen der Vergangenheit angehören und keinen modernen Wert haben, außer Menschen zu verwirren, die auf sie stoßen könnten .Die Gründe für die Einführung von Trigraphen sind im Abschnitt zur Geschichte von ISO / IEC 646 besser zu verstehen :
(Hervorhebung von mir)
Im Wesentlichen wurden einige benötigte Zeichen (für die ein Trigraph existiert) in bestimmten nationalen Varianten ersetzt. Dies führt zu einer alternativen Darstellung unter Verwendung von Trigraphen, die aus Zeichen bestehen, die andere Varianten noch hatten.
quelle