3.6.5. Constantes

En el antiguo C (pre-Estándar), si se deseaba crear una constante, se debía utilizar el preprocesador:

#define PI 3.14159

En cualquier sitio en el que utilizase PI, el preprocesador lo substituía por el valor 3.14159 (aún se puede utilizar este método en C y C++).

Cuando se utiliza el preprocesador para crear constantes, su control queda fuera del ámbito del compilador. No existe ninguna comprobación de tipo y no se puede obtener la dirección de PI (de modo que no se puede pasar un puntero o una referencia a PI). PI no puede ser una variable de un tipo definido por el usuario. El significado de PI dura desde el punto en que es definida, hasta el final del fichero; el preprocesador no entiende de ámbitos.

C++ introduce el concepto de constantes con nombre que es lo mismo que variable, excepto que su valor no puede cambiar. El modificador const le indica al compilador que el nombre representa una constante. Cualquier tipo de datos predefinido o definido por el usuario, puede ser definido como const. Si se define algo como const y luego se intenta modificar, el compilador generará un error.

Se debe especificar el tipo de un const, de este modo:

const int x = 10;

En C y C++ Estándar, se puede usar una constante en una lista de argumentos, incluso si el argumento que ocupa es un puntero o una referencia (p.e, se puede obtener la dirección de una constante). Las constantes tienen ámbito, al igual que una variable ordinaria, de modo que se puede «esconder» una constante dentro de una función y estar seguro de que ese nombre no afectará al resto del programa.

const ha sido tomado de C++ e incorporado al C Estándar pero un modo un poco distinto. En C, el compilador trata a const del mismo modo que a una variable que tuviera asociado una etiqueta que dice «No me cambies». Cuando se define un const en C, el compilador pide espacio para él, de modo que si se define más de un const con el mismo nombre en dos ficheros distintos (o se ubica la definición en un fichero de cabeceras), el enlazador generará mensajes de error sobre del conflicto. El concepto de const en C es diferente de su utilización en C++ (en resumen, es más bonito en C++).

Valores constantes

En C++, una constante debe tener siempre un valor inicial (En C, eso no es cierto). Los valores de las constantes para tipos predefinidos se expresan en decimal, octal, hexadecimal, o números con punto flotante (desgraciadamente, no se consideró que los binarios fuesen importantes), o como caracteres.

A falta de cualquier otra pista, el compilador assume que el valor de una constante es un número decimal. Los números 47, 0 y 1101 se tratan como números decimales.

Un valor constante con un cero al principio se trata como un número octal (base 8). Los números con base 8 pueden contener únicamente dígitos del 0 al 7; el compilador interpreta otros dígitos como un error. Un número octal legítimo es 017 (15 en base 10).

Un valor constante con 0x al principio se trata como un número hexadecimal (base 16). Los números con base 16 pueden contener dígitos del 0 al 9 y letras de la a a la f o A a F. Un número hexadecimal legítimo es 0x1fe (510 en base 10).

Los números en punto flotante pueden contener comas decimales y potencias exponenciales (representadas mediante e, lo que significa «10 elevado a»). Tanto el punto decimal como la e son opcionales. Si se asigna una constante a una variable de punto flotante, el compilador tomará el valor de la constante y la convertirá a un número en punto flotante (este proceso es una forma de lo que se conoce como conversión implícita de tipo). De todos modos, es una buena idea el usar el punto decimal o una e para recordar al lector que está utilizando un número en punto flotante; algunos compiladores incluso necesitan esta pista.

Algunos valores válidos para una constante en punto flotante son: 1e4, 1.0001, 47.0, 0.0 y 1.159e-77. Se pueden añadir sufijos para forzar el tipo de número de punto flotante: f o F fuerza que sea float, L o l fuerza que sea un long double; de lo contrario, el número será un double.

Las constantes de tipo char son caracteres entre comillas simples, tales como: 'A', 'o', ''. Fíjese en que hay una gran diferencia entre el carácter 'o' (ASCII 96) y el valor 0. Los caracteres especiales se representan con la «barra invertida»: '\n' (nueva línea), '\t' (tabulación), '\\' (barra invertida), '\r' (retorno de carro), '\"' (comilla doble), '\'' (comilla simple), etc. Incluso se puede expresar constantes de tipo char en octal: '\17' o hexadecimal: '\xff'.