2010-10-05 11 views
5

avevo trovato un'uscita strano quando scrivo le seguenti linee in modo molto semplice:Stampa ?? e !! in sequenza diversa mostrerà output diverso

Codice:

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

uscita: alt text

succede anche il codice è compilato sia in MBCS che in UNICODE.

L'output varia sulla sequenza di "?" e "!" ...

Qualche idea?

+0

Spiegato di seguito: Per superare basta sfuggire a uno dei punti interrogativi. –

+3

La parte migliore dei trigraph è che se non si sa come vengono chiamati, è impossibile cercarli. :-) (Google non è di grande aiuto quando viene chiesto "??") –

+0

@JamesMcNellis Una ricerca per "??!" in [SymbolHound] (http://www.symbolhound.com/) mi ha guidato qui :) –

risposta

5

Puoi provare

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

Nella programmazione di computer, digrammi e trigrammi sono sequenze di due e di tre personaggi, rispettivamente, che vengono interpretati come un carattere dal linguaggio di programmazione.

Alcuni compilatori supportano un'opzione per disattivare il riconoscimento dei trigrafini o disabilitare i trigrafi per impostazione predefinita e richiedono un'opzione per attivarli. Alcuni possono emettere avvisi quando incontrano i trigraph nei file sorgente. Borland ha fornito un programma separato, il preprocessore del trigramma, da utilizzare solo quando è richiesta l'elaborazione del trigramma.

16

??! è un trigraph che viene sostituito da |.

Come regola generale, non posizionare mai due caratteri punto interrogativo insieme in un file di origine.

+0

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

+1

O in qualsiasi altro posto, se è per questo. :) – jalf

+0

@jalf: Vorrei che il comitato ANSI C avesse seguito la tua regola ... ;-) –

5

Essi sono chiamati Trigraph Sequences

??! è la sequenza trigraph per barra verticale |.

Il preprocessore C/C++ riconosce i trigrafi e li sostituisce con il loro carattere equivalente.
Quindi, quando il codice viene visualizzato dal compilatore, i trigrefi sono già stati sostituiti.

# 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

Tutti questi esempi sono in stringhe, ma va notato che il trigramma la sostituzione avviene ** ovunque **, non solo nelle stringhe. –

4

Il ??! è noto come trigraph e viene sostituito con | in uscita. Controlla questo link

2

È una sequenza speciale di caratteri in una stringa costante che ha un significato speciale. Chiamato un trigramma, sono stati inizialmente implementati perché non tutti i terminali supportavano alcuni personaggi.

+1

... al giorno d'oggi, invece, sono implementati solo per rendere la programmazione più interessante.:) –

+0

@DevSolar: ??? Cosa significa il tuo commento? – Hogan

+0

@Matteo: vero. La programmazione è def non interessante. – Hogan

Problemi correlati