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++).
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'
.