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:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
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 albernen trigr.c
Programm selbst einen Überblick über die Ausgabe erhalten :
void main(){ const char *s = "??!??!"; }
und Verarbeitung mit:
cpp -trigraphs trigr.c
Sie erhalten eine Konsolenausgabe von
void main(){ const char *s = "||"; }
Wie Sie sehen können, -trigraphs
muss die Option angegeben werden, sonst cpp
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 :
ISO / IEC 646 und sein Vorgänger ASCII (ANSI X3.4) haben die bestehende Praxis in Bezug auf Zeichenkodierungen in der Telekommunikationsbranche weitgehend gebilligt.
Da ASCII keine Anzahl von Zeichen bereitstellte, die für andere Sprachen als Englisch benötigt wurden, wurde eine Reihe von nationalen Varianten erstellt, die einige weniger verwendete Zeichen durch benötigte ersetzten .
(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.
!ErrorHasOccurred() ??!???! HandleError();
die Kompilierung? Das ist??!
???
!
. Beweist den Punkt?