Apéndice D: Trigrafos y símbolos alternativos
Trigrafos
La primera tarea del compilador, antes de ninguna otra, consiste en buscar y sustituir secuencias de trigrafos, conjuntos de tres caracteres que empiezan por ??. Esta capacidad existe para solventar el problema con teclados que no dispongan de ciertos caracteres muy usados en C++, como la ~, o en ciertos países {, }, [ o ].
Los trigrafos son en esos casos de gran utilidad. Pero aunque no los necesitemos, es bueno conocerlos, ya que podemos ver listados de programas C++ con extraños símbolos, y debemos ser capaces de interpretarlos.
Sólo existen nueve de esos trigrafos, así que tampoco es tan complicado:
Trigrafo | Sustitución |
---|---|
??= | # |
??/ | \ |
??' | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
Por ejemplo:
??=include <iostream> using namespace std; class clase ??< public: clase(); ??-clase(); private: char *s; ??>; int main() ??< char cad??(10??) = "hola"; if(cad??(0??) == 'h' ??!??! cad??(1??) == 'o') cout << cad << endl; return 0; ??>
Se convierte en:
#include <iostream> using namespace std; class clase { public: clase(); ~clase(); private: char *s; }; int main() { char cad[10] = "hola"; if(cad[0] == 'h' || cad[1] == 'o') cout << cad << endl; return 0; }
No todos los compiladores disponen de este mecanismo, por ejemplo, el compilador GCC incluido en las últimas versiones de Dev-C++ no lo tiene.
Símbolos alternativos
La utilidad de estos símbolos es parecida a la de los trigrafos: proporcionar alternativas para incluir ciertos caracteres que pueden no estar presentes en ciertos teclados.
Existen más de estos símbolos que de los trigrafos, y en general son más manejables y legibles, veamos la lista:
Alternativo | Primario |
---|---|
<% | { |
%> | } |
<: | [ |
:> | ] |
%: | # |
%:%: | ## |
and | && |
bitor | | |
or | || |
xor | ^ |
compl | ~ |
bitand | & |
and_eq | &= |
or_eq | |= |
xor_eq | ^= |
not | ! |
not_eq | != |
Veamos el mismo ejemplo anterior:
%:include <iostream> using namespace std; class clase <% public: clase(); compl clase(); private: char *s; %>; int main() <% char cad<:10:> = "hola"; if(cad<:0:> == 'h' or cad<:1:> == 'o') cout << cad << endl; return 0; %>
Se convierte en:
#include <iostream> using namespace std; class clase { public: clase(); ~clase(); private: char *s; }; int main() { char cad[10] = "hola"; if(cad[0] == 'h' || cad[1] == 'o') cout << cad << endl; return 0; }
En este caso, Dev-C++ sí dispone de estos símbolos, y algunos pueden añadir claridad al código, como usar or ó and, pero no deberían usarse para entorpecer la lectura del programa, por muy tentador que esto sea. ;-)