Constantes en C (const, enum, macro)

Author
By Darío Rivera
Posted on 2022-08-01 in Lenguaje C

En artículos anteriores hemos visto cómo declarar variables y todos los tipos de datos que tenemos disponibles en el lenguaje C. En este post verás un tipo muy especial que en programación llamamos constantes. Verás que son, cómo crearlas y cómo utilizarlas.

Qué es una constante?

En programación una constante es un valor que no puede ser alterado durante la ejecución de un programa. Más específicamente, lo que no se puede cambiar es el valor en memoria de una asignación (a donde apunta una variable), por ejemplo, un entero.

Esto significa que si ya definimos una variable con un valor este no puede ser cambiado en ningún punto del programa.

Const

En C podemos definir constantes con la palabra reservada const. Observa el siguiente ejemplo en donde definimos una constante decimal y la imprimimos en pantalla.

#include <stdio.h>

int main()
{
    const float pi = 3.1416;
    printf("The value of PI is %.4f\n", pi);
}

Si intentaras cambiar el valor de pi justo antes de imprimirla obtendrías un error del compilador. Es por esta misma razón que las constantes deben ser inicializadas a la misma vez que declaradas, porque su valor no puede cambiar a lo largo del programa.

Macros

Otra forma de definir una constante (esto aplica más cuando la vas a utilizar en varios archivos alrededor de tu proyecto), es con la instrucción del preprocesador DEFINE. el cual te permite utilizar macros en C.

#include <stdio.h>
#define PI 3.1416

int main()
{
    printf("The value of PI is %.4f\n", PI);
}

En este último caso, el preprocesador reemplazará el valor definido en cada parte del archivo antes de pasar el código al compilador. Nota que no es necesario colocar punto y coma al final de la línea con la instrucción del preprocesador.

Enum

Las variables enumeradas permiten definir constantes agrupadas. Cada constante pertenece a un conjunto llamado "conjunto de enumeración". Observa la siguiente definición en donde se define el tipo YEAR.

enum YEAR {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };

Cuando utilizamos enum de esta forma en realidad estamos definiendo un tipo de dato que en nuestro caso es YEAR. El primer valor del conjunto de enumeración siempre será cero a menos que se inicialice con un valor diferente. En nuestro caso se inicializó JAN con uno. Los demás valores seguirán la secuencia, FEB=2, etc. Veamos el siguiente ejemplo.

#include <stdio.h>
#define MES_HASTA 5

int main()
{
   enum YEAR {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};

   for (int i = JAN; i <= DEC; i++) {
      printf("Mes No: %d\n", i);

      if (i == MES_HASTA)
        break;
   }

   return(0);
}

Observa el uso de las constantes JAN y DEC para iterar los meses del año. Puesto que MES_HASTA es 5 la salida en consola será la siguiente:

Mes No: 1
Mes No: 2
Mes No: 3
Mes No: 4
Mes No: 5

Podemos definir también variables de un tipo enum creado por nosotros. Veamos el siguiente ejemplo:

#include <stdio.h>

int main()
{
    /* se define el tipo de dato ESTADO y la variable proceso de ese tipo */
    enum ESTADO { EXIT, OK } proceso;
    int numero;

    proceso = OK;   /* se asigna la constance OK a proceso */

    while (proceso)
    {
        printf("Ingrese un número par:\n");
        scanf("%d", &numero);

        if (numero % 2 != 0)
            proceso = EXIT;
    }
    printf("El número que ingreso no es par, GAME OVER!\n");

    return(0);
}

A pesar de que pareciera que las constantes con enum son simple enteros, esto no es así, son un tipo de dato definido por el usuario. Si quisieramos cambiar la asignación de la variable proceso por lo siguiente

proceso = 1; // supuestamente OK

Obtendríamos un error del compilador similar al siguiente:

error: invalid conversion from ‘int’

En este último ejemplo también podríamos declarar e inicializar un variable en una misma sentencia así:

enum ESTADO proc2 = EXIT;

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.