Vi una línea de C que se veía así:
!ErrorHasOccured() ??!??! HandleError();
Se compiló correctamente y parece funcionar bien. Parece que está comprobando si ha ocurrido un error, y si lo ha hecho, lo maneja. Pero no estoy realmente seguro de lo que realmente está haciendo o cómo lo está haciendo. Parece que el programador está tratando de expresar sus sentimientos sobre los errores.
Nunca he visto lo ??!??!
anterior en ningún lenguaje de programación, y no puedo encontrar documentación para ello en ningún lado. (Google no ayuda con los términos de búsqueda como ??!??!
). ¿Qué hace y cómo funciona el código de muestra?
!ErrorHasOccurred() ??!???! HandleError();
compilar? Eso es??!
???
!
. Prueba el punto?ErrorHasOccured() && HandleError()
mí mismo. Así también lo hace Lua.Respuestas:
??!
es un trigraph que se traduce|
. Entonces dice:que, debido a cortocircuito, es equivalente a:
Gurú de la semana (trata sobre C ++ pero relevante aquí), donde lo recogí.
Posible origen de los trigrafos o como @DwB señala en los comentarios, es más probable debido a que EBCDIC es difícil (nuevamente). Esta discusión en la junta de desarrolladores de IBM parece apoyar esa teoría.
De ISO / IEC 9899: 1999 §5.2.1.1, nota al pie 12 (h / t @ Random832):
fuente
if (ErrorHasOccured()) HandleError()
. Afortunadamente, generalmente solo encuentras este idioma en código perl.ErrorHasOccurred() && HandleError();
Es decir, si está acostumbrado a ejecutar scripts. :)Bueno, por qué esto existe en general es probablemente diferente de por qué existe en su ejemplo.
Todo comenzó hace medio siglo con la reutilización de terminales de comunicación impresas como interfaces de usuario de computadora. En la era inicial de Unix y C, ese era el teletipo ASR-33.
Este dispositivo era lento (10 cps), ruidoso y feo, y su vista del conjunto de caracteres ASCII terminaba en 0x5f, por lo que no tenía (mira detenidamente la foto) ninguna de las teclas:
Los trigrafos se definieron para solucionar un problema específico. La idea era que los programas C pudieran usar el subconjunto ASCII que se encuentra en el ASR-33 y en otros entornos sin los valores ASCII altos.
Sin embargo, las personas que escriben el código C casi por definición tenían un equipo moderno, 1 así que supongo que: alguien presumiendo o divirtiéndose, dejando una especie de huevo de Pascua en el código para que lo encuentres.
Realmente funcionó, condujo a una pregunta SO muy popular.
Teletipo ASR-33
1. Para el caso, los trigrafos fueron inventados por el comité ANSI, que se reunió por primera vez después de que C se convirtiera en un éxito desbocado, por lo que ninguno de los códigos o codificadores originales de C los habría utilizado.
fuente
#
fue reemplazado por£
. En otras regiones, tal vez "ASCII" no tenía llaves, etc.if (x || y) { a[i] = '\0'; }
verseif (x öö y) ä aÄiÅ = 'Ö0'; å
en el juego de caracteres incorrecto.Es un C trigraph .
??!
es|
, también lo??!??!
es el operador||
fuente
<iso646.h>
archivo de encabezado.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:
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 untrigr.c
programa tonto :y procesarlo con:
Obtendrá una salida de consola de
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 :
(é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.
fuente