este problema se puede abordar de variadas maneras, sin embargo te mostramos la que en nuestra opinión es la resolución más completa.
Solución:
Esta pregunta (sobre los dígrafos estrechamente relacionados) tiene la respuesta.
Todo se reduce al hecho de que el conjunto de caracteres ISO 646 no tiene todos los caracteres de la sintaxis C, por lo que hay algunos sistemas con teclados y pantallas que no pueden manejar los caracteres (aunque me imagino que estos son bastante raros hoy en día).
En general, no necesita usarlos, pero necesita conocerlos exactamente para el problema que encontró. Los trígrafos son la razón por la ‘?
El carácter tiene una secuencia de escape:
'?'
Entonces, un par de formas en que puede evitar su problema de ejemplo son:
printf( "What??!n" );
printf( "What?" "?!n" );
Pero tienes que recordar cuando estás escribiendo los dos ‘?’ caracteres en los que podrías estar comenzando un trígrafo (y ciertamente nunca es algo en lo que esté pensando).
En la práctica, los trígrafos y los dígrafos son algo que no me preocupa en absoluto en el día a día. Pero debe estar al tanto de ellos porque una vez cada dos años se encontrará con un error relacionado con ellos (y pasará el resto del día maldiciendo su existencia). Sería bueno si los compiladores pudieran configurarse para advertir (o generar un error) cuando se encuentran con un trígrafo o un dígrafo, para poder saber que tengo algo con lo que debo tratar a sabiendas.
Y solo para completar, los dígrafos son mucho menos peligrosos ya que se procesan como tokens, por lo que un dígrafo dentro de un string literal no se interpretará como un dígrafo.
Para obtener una buena educación sobre varias diversiones con la puntuación en los programas C/C++ (incluido un error de trigraph que definitivamente me haría tirarme de los pelos), eche un vistazo al artículo GOTW #86 de Herb Sutter.
Apéndice:
Parece que GCC no procesará (y advertirá sobre) trigraphs por defecto. Algunos otros compiladores tienen opciones para desactivar el soporte de trigraph (IBM, por ejemplo). Microsoft comenzó a admitir una advertencia (C4837) en VS2008 que debe habilitarse explícitamente (usando -Wall o algo así).
¡Niños de hoy! 🙂
Sí, equipo extranjero, como una terminal IBM 3270. El 3270 tiene, si mal no recuerdo, ¡no tiene llaves! Si quisiera escribir C en un mini/mainframe de IBM, tuve que usa los miserables trigraphs para cada límite de bloque. Afortunadamente, solo tuve que escribir software en C para emular algunas instalaciones de minicomputadoras de IBM, en realidad no escriben software C sobre el Sistema/36.
Mira al lado de la “P” key:
Mmm. Difícil de decir. Hay un botón adicional al lado de “retorno de carro”, y podría tenerlo al revés: tal vez fue el “[” / “]” par que faltaba. En cualquier caso, este teclado te causaría pena si tuvieras que escribir C.
Además, estos terminales muestran EBCDIC, el conjunto de caracteres de mainframe “nativo” de IBM, no ASCII (gracias, Pavel Minaev, por el recordatorio).
Por otro lado, como dice la guía GNU C: “No necesitas este daño cerebral”. El compilador gcc deja esta “característica” deshabilitada de forma predeterminada.
Desde The C++ Programming Language
Edición especial, página 829
Los caracteres especiales ASCII
[
,]
,,
,
|
yocupan posiciones de conjuntos de caracteres designados como alfabéticos por ISO. En la mayoría de los conjuntos de caracteres ISO-646 nacionales europeos, estas posiciones están ocupadas por letras que no se encuentran en el alfabeto inglés.
Se proporciona un conjunto de trígrafos para permitir que los caracteres nacionales se expresen de forma portátil utilizando un conjunto de caracteres mínimo verdaderamente estándar. Esto puede ser útil para el intercambio de programas, pero no facilita que las personas lean los programas. Naturalmente, la solución a largo plazo para este problema es que los programadores de C++ obtengan equipos que admitan bien su lenguaje nativo y C++. Desafortunadamente, esto parece ser inviable para algunos, y la introducción de nuevos equipos puede ser un proceso frustrantemente lento.
Si posees alguna vacilación o forma de reformar nuestro ensayo puedes realizar una observación y con deseo lo observaremos.