Explicación detallada de enum (enumeración) en lenguaje C

enumEs una abreviatura de la palabra enumerar (enumeración, enumeración), que es una constante en lenguaje C y se denomina constante de enumeración . enumProporciona una manera conveniente de asociar valores con nombres como #definealternativa a .

enumPuede considerarse como una matriz especial, que es una lista de constantes , y esta constante solo puede ser de tipo entero.

Entonces, si hay algunas constantes irrelevantes y discontinuas, simplemente defina algunas constantes directamente. Pero si es relacionado o continuo, es enummás eficiente de usar.

Pero las enumeraciones se diferencian de las matrices y las tuplas de tres formas:

  1. La enumeración no utiliza subíndices para ubicar valores de elementos, sino palabras clave;
  2. Los valores en diferentes enumpueden ser los mismos, pero los nombres deben ser diferentes;
  3. enumEl valor predeterminado es 0, 1, 2..., mientras que las matrices tienen el valor predeterminado nulo o , según el tipo 0.

Si no comprende el párrafo anterior, puede consultar los siguientes ejemplos y códigos para comprenderlo.

Estrictamente hablando, aquí no se llama "palabra clave (palabra clave)", sino "nombre (nombre)". Porque en el primer manual de lenguaje C ampliamente utilizado "El lenguaje de programación C", el texto original es la palabra "nombre".

El siguiente es el caso más común, y también es el caso más común en Internet, tomemos esto como ejemplo para comenzar una introducción detallada:

enum months {
    
    Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

El método de uso dado en Internet es el siguiente (un poco complicado, pero en realidad, este método no se recomienda en este caso, y será resumido más adelante):

int main()
{
    
    
    enum months mon;	/* 声明month是months中的一个值,需要注意这里的mon是变量 */
    mon = Jan;			/* mon的值等于Jan表示的值 */
    printf("%d\n",mon);	/* 输出mon的值 */
    return 0;
}

La salida aquí es 0. Es porque el valor representado por el nombre no está definido, por lo que se utiliza el valor predeterminado 0, 1, 2..., Janpero el primero, es decir 0.

¿Y si queremos que el valor correspondiente al nombre en esta enumeración sea su mes?
Definitivamente pensarás, enumeración, entonces uno por uno es igual. De hecho, esto es posible, pero los meses aquí son números enteros consecutivos, por lo que no necesita igualar cada uno, solo el primero Jan=1, de la siguiente manera:

enum months {
    
    Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

SepDe esta manera, no solo se obtiene la salida 1, sino que también Sepse obtiene la salida 9, sin tener que ser tan fastidioso uno por uno.

Al ver esto, puede pensar, ¿tiene que obtener uno monpara obtener el valor? Porque obtener el valor de una constante a través de una variable es bastante innecesario en muchos casos.

monNo solo no es necesario aquí , sino monthsque ni siquiera es necesario, porque enumen realidad es una colección de constantes, y el contenido se distingue por el nombre de la constante, no por enumel nombre de la constante. Aquí hay un ejemplo:

#include<stdio.h>

enum {
    
    Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum {
    
    Mon=1, Tue, Wed, Thur, Fri, Sat, Sun};

int main()
{
    
    
    printf("%d, %d\n", Mon, Jan);
	return 0;
}

La salida es:

1, 1

Entonces, ¿cuándo usar el primer método y cuándo usar el segundo?

Como se mencionó al principio del artículo, enumes una constante. La mayoría de las personas no simplemente hacen que una variable sea igual a una constante y luego generan la variable, solo para generar el valor de la constante, sino que solo generan la constante directamente.

Por lo tanto, en la mayoría de los casos, el segundo método se puede usar directamente, porque los nombres no se repetirán. El primer método es para algunos casos especiales. Por ejemplo, si desea que el valor de retorno de la función tenga 4 casos (en realidad puede haber más casos), el valor entero del orden representado por cada caso 0, 1, 2, 3es el siguiente:

enum state {
    
    Standard, Error, Position_1, Position_2}

En este momento, el código se puede escribir como (mucha simplificación aquí, solo para mostrar esta situación):

int test() {
    
    
    enum state ret
    if (...) {
    
    
        ret = Standard
    } else if (...) {
    
    
        ret = Error
    } else if (...) {
    
    
        ret = Position_1
    } else if (...) {
    
    
        ret = Position_2
    }
    return ret
}

Esto es más conveniente en algunos casos.

Espero ayudar a los necesitados ~

Supongo que te gusta

Origin blog.csdn.net/qq_33919450/article/details/130244552
Recomendado
Clasificación