2010-10-05 26 views
5

que había encontrado una salida extraña cuando escribo las siguientes líneas en forma muy simple:Imprimir ?? y !! en diferente secuencia mostrará un resultado diferente

Código:

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

Salida: alt text

Sucede incluso el código se compila bajo MBCS y UNICODE.

La salida varía en la secuencia de "?" y "!" ...

¿Alguna idea?

+0

Explicación a continuación: Para superar simplemente escape uno de los signos de interrogación. –

+3

La mejor parte de los trigrafos es que si no sabes cómo se llaman, es imposible buscarlos. :-) (Google no es demasiado útil cuando se le preguntó acerca de "??") –

+0

@JamesMcNellis Una búsqueda de '??!' en [SymbolHound] (http://www.symbolhound.com/) me llevó aquí :) –

Respuesta

5

Puede intentar

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

En la programación informática, dígrafos y trigrafos son secuencias de dos y tres caracteres, respectivamente, que se interpretan como un personaje por el lenguaje de programación.

Algunos compiladores admiten una opción para desactivar el reconocimiento de trigrafos, o deshabilitar los trigrafos por defecto y requieren una opción para activarlos. Algunos pueden emitir advertencias cuando se encuentran con trigrafos en los archivos fuente. Borland suministró un programa separado, el preprocesador de trigrafos, para ser utilizado solo cuando se desea el procesamiento de trigrafos.

16

??! es un trigraph que se reemplaza por |.

Como regla, nunca debe colocar dos caracteres de signo de interrogación juntos en ningún lugar en un archivo de origen.

+0

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

+1

O en cualquier otro lugar, para el caso. :) – jalf

+0

@jalf: Desearía que el comité ANSI C hubiera seguido su regla ... ;-) –

5

Se llaman Trigraph Sequences

??! es la secuencia de trigraph de la barra vertical del |.

El preprocesador C/C++ reconoce los trigraphs y los reemplaza con su carácter equivalente.
Por lo tanto, cuando el compilador ve el código, los trigrafos ya están reemplazados.

# 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

Todos estos ejemplos están en cadenas, pero debe tenerse en cuenta que trigraph el reemplazo ocurre ** en todas partes **, no solo en cadenas. –

4

The ??! se conoce como trigraph y se reemplaza con | en salida. Comprueba esto link

2

Es una secuencia especial de caracteres en una constante de cadena que tiene un significado especial. Llamados trigrafos, se implementaron originalmente porque no todas las terminales admiten algunos caracteres.

+1

... actualmente, en cambio, se implementan solo para hacer que la programación sea más interesante.:) –

+0

@DevSolar: ??? ¿Qué significa tu comentario? – Hogan

+0

@Matteo: cierto. La programación definitivamente no es interesante. – Hogan

Cuestiones relacionadas