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. ;-)