En un libro que estoy leyendo, las constantes de enumeración se han introducido antes que las matrices. El uso de matrices se ha demostrado solo a través de un par de ejemplos. A continuación se afirma:
enum corvid { magpie, raven, jay, corvid_num}; char const * const bird [ corvid_num ] = { [raven] = "raven", [magpie] = "magpie", [jay] = "jay", }; for ( unsigned i = 0; i < corvid_num ; ++i) printf ("Corvid %u is the %s\n", i, bird[i]);Esto declara un nuevo tipo de entero enum corvid para el que conocemos cuatro valores diferentes.
Para llevar: las constantes de enumeración tienen un valor explícito o posicional
Como habrás adivinado, los valores posicionales comienzan desde 0 en adelante, por lo que en nuestro ejemplo tenemos raven con valor 0, magpie con 1, jay con 2 y corvid_num con 3. Estos últimos 3 son obviamente los 3 que nos interesan.
Pregunta 1:
¿ [magpie] = "magpie" implica que la posición de la magpie se refiere al valor "magpie" .
Pregunta 2:
De acuerdo con loop, ¿cómo es bird[0] igual a "raven" , ya que esto es explícito y no un valor posicional? Además, después de la primera iteración, [i + 1] será igual a [magpie] . En general, ¿por qué el tipo de variable de bucle no está firmado y no es corvid o enum corvid?
Creo que he entendido mal las constantes de enumeración.
también de,
Como habrás adivinado, los valores posicionales comienzan desde 0 en adelante, por lo que en nuestro ejemplo tenemos
ravencon valor 0,magpiecon 1,jaycon 2 ycorvid_numcon 3. Estos últimos 3 son obviamente los 3 que nos interesan.
¿Tiene razón el autor al decir que el cuervo debe tener el valor 0 y no la urraca? Si se trata de un error tipográfico, se dispensará la totalidad de mi confusión.
En la declaración char const * const bird [ corvid_num ] el elemento entre [ ] es el tamaño de la matriz. En la lista de inicializadores, [ raven ] = " raven " , el elemento entre [ ] es el llamado inicializador designado , que se usa para inicializar un elemento particular en la matriz.
Pregunta 1: ¿'[urraca] = "urraca"' implica que la posición TH de 'urraca' se refiere al valor "urraca"?
Sí.
Pregunta 2: De acuerdo con el bucle, ¿cómo es pájaro [0] igual a "cuervo", ya que esto es explícito y no un valor posicional?
Porque las enumeraciones se nombran constantes. Si a una constante de enumeración ( raven , etc.) no se le da un número de forma explícita, se le da uno implícitamente, comenzando en 0. raven en su ejemplo es el segundo elemento de la enumeración, por lo que obtiene el valor 1 y cada vez que escribe raven en el fuente será equivalente a escribir 1 .
Como habrás adivinado, los valores posicionales comienzan desde 0 en adelante, por lo que en nuestro ejemplo tenemos raven con valor 0, magpie con 1, jay con 2 y corvid_num con 3. Estos últimos 3 son obviamente los 3 que nos interesan.
Este es un error en Gustedt - Modern C . Errata podría existir? El resultado del código de ejemplo es:
Corvid 0 is the magpie Corvid 1 is the raven Corvid 2 is the jayEn particular, si no hubiéramos usado inicializadores designados sino que hubiéramos hecho esto:
char const * const bird [ corvid_num ] = { "raven", "magpie", "jay", };Entonces la salida se habría convertido en cambio
Corvid 0 is the raven Corvid 1 is the magpie Corvid 2 is the jayCada caso de enum obtiene el valor del caso anterior más uno, a menos que se anule explícitamente, y el primer caso obtiene el valor cero. Así que aquí magpie es 0 , raven es 1 , etc. (La parte citada que dice lo contrario es incorrecta). El caso final corvid_num es el conteo de otros casos en la matriz, ya que el + 1 de ese caso representa el caso cero en el comienzo.
La inicialización de la matriz utiliza inicializadores designados por C99, lo que permite asignar valores a índices específicos y en cualquier orden, es decir, [raven] = "raven" inicializa el índice raven (aquí 1 ). Sería posible enumerar tradicionalmente cada valor en orden, pero hacerlo de esta manera permite reordenar los casos de enumeración sin tener que sincronizar los cambios con la matriz.