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