3.2.3e Secuencias de escape
§1 Sinopsis
Como se indicó al tratar del código ASCII ( 2.2.1a), existen 33 de estos caracteres que no tienen representación gráfica; son los denominados caracteres de control. Con el fin de poder representarlos en el código fuente, se recurrió al artificio de representarlos utilizando una barra invertida (\) seguida de otra serie de caracteres.
§2 Secuencias de escape
Las secuencias de caracteres en las que el primero es la barra invertida, se denominaron secuencias de escape y aunque originariamente se utilizaron para la representación de los caracteres de control, por extensión pueden representarse de este modo todos los códigos ASCII. Además se dispone de algunos símbolos predefinidos para los caracteres más frecuentes. Por ejemplo, \n se utiliza para representar el carácter nueva línea (decimal 10). Los símbolos utilizados se muestran en la tabla adjunta.
Secuencia Valor Símbolo Descripción
\a 0x07 BEL Sonido audible (bell)
\b 0x08 BS Retroceso (backspace)
\f 0x0C FF Salto de formato (formfeed)
\n 0x0A LF Saltar una línea (linefeed)
\r 0x0D CR Retorno de carro (carriage return)
\t 0x09 HT Tabulación horizontal (H Tab)
\v 0x0B VT Tabulación vertical (V Tab)
\\ 0x5c \ Barra invertida (backslash) [2]
\' 0x27 ' Apóstrofo (comilla simple)
\" 0x22 " Doble comilla
\? 0x3F ? Interrogación
\O cualquiera cualquiera O = cadena de hasta tres dígitos octales
\xH cualquiera cualquiera H = cadena de dígitos hexadecimales
\XH cualquiera cualquiera H = cadena de dígitos hexadecimales
Ejemplo
char campana = '\a'; // carácter ASCII 7
cout << campana << endl; // genera un sonido audible
§3 La barra invertida ( \
) se utiliza junto con números octales
o hexadecimales
[3]
para representar símbolos ASCII (
2.2.1a), incluyendo los denominados
caracteres de control
(también llamados caracteres no imprimibles) que no tienen representación
directa en ningún carácter.
En una secuencia de escape se pueden utilizar hasta tres caracteres en octal o cualquier número de caracteres en hexadecimal. Siempre que los valores estén dentro del rango legal para el tipo char (de 0 a 0xff para C++Builder).
§3.1 Octal
Rango: \0 a \377
Ejemplos:
\0 Carácter nulo (fin de cadena) \03 Ctr-C \07 Bell \013 Vertical TAB \077 ?
§3.2 Hexadecimal
Rango \x00 a \xFF
Ejemplos:
\0
Carácter nulo (fin de cadena)
\x3
Ctr-C
\x7
Bell
\xB
Vertical TAB
\x3F
?
§4 Los números mayores que los indicados generan un error de compilación:
Numeric constant too large
. Por ejemplo, el octal \777 es mayor que el máximo permitido (\377), por
lo que produciría un error. El primer carácter no octal o no hexadecimal que se encuentre en una secuencia octal o hexadecimal
respectivamente, señala el final de la secuencia de escape. Por ejemplo:
printf("\x072.1Un Sistema Operativo");
La sentencia anterior debería ser interpretada como el hexadecimal \x07
(BEL) y 2.1 Un Sistema Operativo
, aunque quizás el compilador lo interprete
como hexadecimal \x072 (el carácter "r") y la cadena literal .1Un sistema Operativo
. Para
evitar este tipo de ambigüedades debe escribirse:
printf("\x07" "2.1Un Sistema Operativo");
También pueden darse ambigüedades si una secuencia de escape en octal es seguida por un número no octal. Por ejemplo, dado que los dígitos 8 y 9 no son octales válidos, la constante \258 puede ser interpretada como una constante de dos caracteres \25 (Ctrl-U) y un 8.
§5 Trigrafos
Con la extensión de la informática a países distintos del ámbito anglosajón, se presentaba con frecuencia el problema de tener que escribir determinados caracteres del lenguaje C++ (Us-ASCII) que no estaban presentes en determinados teclados. Por ejemplo, en la mayoría de teclados en Español, no existe la tilde ~ como un carácter independiente, lo que no es inconveniente para la escritura normal, ya que la única ocurrencia en este signo en Español es en la letra eñe "Ñ" que sí dispone de su correspondiente tecla. Pero la referida ausencia de la tilde como símbolo independiente, resulta una molestia para los programadores, ya que el fuente requiere en ocasiones incluir dicho símbolo. Para resolver el problema se adoptó el convenio que estos caracteres conflictivos podían representarse en el código fuente mediante parejas y ternas de caracteres, los denominados dígrafos y trígrafos, que se muestran en la tabla adjunta.
Trígrafo Carácter Dígrafo
??= # %:
??( [ <:
??) ] :>
??/ \
??' ^
??< { <%
??> } %>
??! |
??- ~
Nota: la interpretación de estos trígrafos retarda considerablemente la acción del compilador, por lo que Borland C++ incluye un traductor específico, el programa trigraph.exe, que puede traducir el código fuente antes de la compilación [4].
Tema relacionado: Representación explícita de operadores lógicos ( 4.9.8).
[2] Para representar la barra invertida debe utilizarse \\.
[3] Observe que en este caso, los Hexadecimales ( 2.2.4b) empiezan por \x ó \X sin el cero inicial (no es \0x !!)
[4] En cualquier caso, el preprocesador que acompaña al compilador Borland C++ 5.5 para Windows 32 no soporta la interpretación de trígrafos, por lo que es obligatorio pasar previamente esta utilidad sobre los fuentes y ficheros de cabecera en caso que se hayan utilizado.