2010-10-05 6 views
5

zeigt ich einen seltsamen Ausgang gefunden hatte, als ich die folgenden Zeilen auf sehr einfache Art und Weise schreiben:Drucken? und !! in unterschiedlicher Reihenfolge unterschiedlichen Ausgang

Code:

printf("LOL??!\n"); 
printf("LOL!!?\n"); 

Ausgang: alt text

Es kommt sogar vor Der Code wird unter MBCS und UNICODE kompiliert.

Die Ausgabe variiert in der Reihenfolge von "?" und "!" ...

Irgendeine Idee?

+0

Unten erklärt: Um zu entkommen nur eines der Fragezeichen. –

+3

Der beste Teil von Trigraphs ist, dass wenn Sie nicht wissen, wie sie heißen, es unmöglich ist, nach ihnen zu suchen. :-) (Google ist nicht allzu hilfreich, wenn nach "??" gefragt wird) –

+0

@JamesMcNellis Eine Suche nach '??!' bei [SymbolHound] (http://www.symbolhound.com/) führte mich hier :) –

Antwort

5

Sie

printf("What?\?!\n"); 

In der Computerprogrammierung kann versuchen, Digraphe und trigraphs sind Sequenzen von zwei und drei Zeichen jeweils die als ein Zeichen von der Programmiersprache interpretiert werden.

Einige Compiler unterstützen eine Option, um die Erkennung von Trigraphen zu deaktivieren, oder deaktivieren Trigraphen standardmäßig und erfordern eine Option, um sie zu aktivieren. Einige können Warnungen ausgeben, wenn sie Trigraphs in Quelldateien finden. Borland lieferte ein separates Programm, den Trigraph-Preprocessor, das nur dann verwendet wird, wenn die Trigraph-Verarbeitung gewünscht wird.

16

??! ist ein trigraph, der durch | ersetzt wird.

In der Regel sollten Sie niemals zwei Fragezeichen in einer Quelldatei zusammenfügen.

+0

http://en.wikipedia.org/wiki/Digraphs_and_trigraphs – ereOn

+1

Oder anderswo, für die Angelegenheit. :) – jalf

+0

@jalf: Ich wünschte, das ANSI C-Komitee wäre deiner Regel gefolgt ... ;-) –

5

Sie sind Trigraph Sequences genannt

??! ist die trigraph Sequenz für Vertical Bar |.

Der C/C++ - Präprozessor erkennt die Trigraphs und ersetzt sie durch ihre entsprechenden Zeichen.
Zu dem Zeitpunkt, zu dem der Code vom Compiler gelesen wird, sind die Trigraphen bereits ersetzt.

# grepping in the source file: 
$ grep printf a.c  
    printf("foo: ??!"); 

# grepping the preprocessor output: 
$ gcc a.c -trigraphs -E | grep printf | grep foo 
    printf("foo: |"); 
+0

Alle diese Beispiele sind in Strings, aber es sollte darauf hingewiesen werden, dass Trigraph Austausch passiert ** überall **, nicht nur in Strings. –

4

Die ??! ist als Trigraph bekannt und wird durch | ersetzt in der Ausgabe. Überprüfen Sie diese link

2

Es ist eine spezielle Zeichenfolge in einer Zeichenfolge-Konstante, die eine besondere Bedeutung hat. Genannt ein Trigraph wurden sie ursprünglich implementiert, weil nicht alle Terminals einige Zeichen unterstützten.

+1

... heutzutage werden sie nur implementiert, um das Programmieren interessanter zu machen.:) –

+0

@DevSolar: ??? Was bedeutet dein Kommentar? – Hogan

+0

@Matteo: Wahr. Programmieren ist def nicht interessant. – Hogan