Como ya se dijo ??!??!
trata esencialmente de dos trigrafos ( ??!
y ??!
nuevamente) agrupados que se reemplazan y traducen ||
, es decir, el OR lógico , por el preprocesador.
La siguiente tabla que contiene cada trigraph debería ayudar a desambiguar combinaciones de trigraph alternativas:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
Fuente: C: A Reference Manual 5th Edition
Entonces, un trigrafo que parece ??(??)
eventualmente mapeado []
, ??(??)??(??)
será reemplazado por [][]
y así sucesivamente, se entiende la idea.
Dado que los trigrafos se sustituyen durante el preprocesamiento, puede usar cpp
para obtener una vista de la salida usted mismo, usando un trigr.c
programa tonto :
void main(){ const char *s = "??!??!"; }
y procesarlo con:
cpp -trigraphs trigr.c
Obtendrá una salida de consola de
void main(){ const char *s = "||"; }
Como puede observar, la opción -trigraphs
debe especificarse o de lo contrariocpp
emitirá una advertencia; Esto indica cómo los trigrafos son cosa del pasado y de ningún valor moderno, aparte de confundir a las personas que podrían toparse con ellos .
En cuanto a la justificación de la introducción de los trigrafos, se entiende mejor cuando se observa la sección de historia de ISO / IEC 646 :
ISO / IEC 646 y su predecesor ASCII (ANSI X3.4) respaldaron en gran medida la práctica existente con respecto a las codificaciones de caracteres en la industria de las telecomunicaciones.
Como ASCII no proporcionó una cantidad de caracteres necesarios para otros idiomas además del inglés, se crearon una serie de variantes nacionales que sustituyeron algunos caracteres menos utilizados por otros necesarios. .
(énfasis mío)
Entonces, en esencia, algunos caracteres necesarios (aquellos para los cuales existe un trigraph) fueron reemplazados en ciertas variantes nacionales. Esto lleva a la representación alternativa utilizando trigrafos compuestos por caracteres que otras variantes todavía tenían alrededor.
!ErrorHasOccurred() ??!???! HandleError();
compilar? Eso es??!
???
!
. Prueba el punto?