Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Výčet se skládá ze sady pojmenovaných celočíselné konstanty. Deklarace typu výčtu poskytuje název (volitelné) značky výčtu. A definuje sadu pojmenovaných celočísných identifikátorů (nazývá se sada výčtů, konstanty výčtu, výčtové konstanty, enumerátory nebo členy). Proměnná typu výčtu ukládá jednu z hodnot sady výčtů definovaných tímto typem.
enum Proměnné typu lze použít v indexovacích výrazech a jako operandy všech aritmetických a relačních operátorů. Výčty poskytují alternativu #define k direktivě preprocesoru s výhodami, které lze vygenerovat pro vás a dodržovat normální pravidla rozsahu.
Ve funkci ANSI C mají výrazy definující hodnotu konstanty enumerátoru vždy typ int . To znamená, že úložiště přidružené k proměnné výčtu je úložiště požadované pro jednu int hodnotu. Konstantu výčtu nebo hodnotu výčtového typu lze použít kdekoli, kde jazyk C povoluje celočíselný výraz.
Syntaxe
enum-specifier:
enum
identifier
volit{enumerator-list}
enum
identifier
enumerator-list:
enumerator
enumerator-list
,
enumerator
enumerator:
enumeration-constant
enumeration-constant
=
constant-expression
enumeration-constant:
identifier
Volitelné identifier názvy typu výčtu definovaného .enumerator-list Tento identifikátor se často označuje jako značka výčtu určeného seznamem. Specifikátor typu deklaruje identifier , že je značkou výčtu určeného enumerator-list neterminalem, jak je vidět zde:
enum identifier
{
// enumerator-list
}
Definuje enumerator-list členy sady výčtů.
Pokud je deklarace značky viditelná, pozdější deklarace, které používají značku, ale vynechat enumerator-list dříve deklarovaný výčtový typ. Značka musí odkazovat na definovaný typ výčtu a tento typ výčtu musí být v aktuálním oboru. Vzhledem k tomu, že typ výčtu je definován jinde, enumerator-list nezobrazí se v této deklaraci. Deklarace typů odvozených z výčtů a typedef deklarací pro typy výčtu mohou použít značku výčtu před definováním typu výčtu.
Každý enumeration-constant v názvech enumerator-list má hodnotu sady výčtů. Ve výchozím nastavení je první enumeration-constant přidružená k hodnotě 0. Další enumeration-constant v seznamu je přidružena k hodnotě ( constant-expression + 1 ), pokud ji explicitně přidružíte k jiné hodnotě. Název je enumeration-constant ekvivalentní jeho hodnotě.
Můžete použít enumeration-constant = constant-expression k přepsání výchozí sekvence hodnot. To znamená, že pokud enumeration-constant = constant-expression se zobrazí v enumerator-list, enumeration-constant je přidružen k hodnotě constant-expressiondané . Musí constant-expression mít int typ a může být záporný.
Následující pravidla platí pro členy sady výčtů:
Sada výčtů může obsahovat duplicitní konstantní hodnoty. Můžete například přidružit hodnotu 0 ke dvěma různým identifikátorům, například členům pojmenovaným
nullazero, ve stejné sadě.Identifikátory v seznamu výčtů musí být odlišné od jiných identifikátorů ve stejném oboru se stejnou viditelností. To zahrnuje běžné názvy proměnných a identifikátory v jiných seznamech výčtů.
Značky výčtu dodržují normální pravidla oborů. Musí se lišit od jiných značek výčtu, struktury a sjednocení se stejnou viditelností.
Příklady
Tyto příklady ilustrují deklarace výčtu:
enum DAY /* Defines an enumeration type */
{
saturday, /* Names day and declares a */
sunday = 0, /* variable named workday with */
monday, /* that type */
tuesday,
wednesday, /* wednesday is associated with 3 */
thursday,
friday
} workday;
Hodnota 0 je ve výchozím nastavení přidružená saturday . Identifikátor sunday je explicitně nastaven na hodnotu 0. Zbývající identifikátory mají ve výchozím nastavení hodnoty 1 až 5.
V tomto příkladu je k proměnné todaypřiřazena hodnota ze sady DAY .
enum DAY today = wednesday;
Název konstanty výčtu se používá k přiřazení hodnoty. Vzhledem k tomu, že typ výčtu DAY byl dříve deklarován, je nutná pouze značka DAY výčtu.
Pokud chcete explicitně přiřadit celočíselnou hodnotu proměnné výčtového datového typu, použijte přetypování typu:
workday = ( enum DAY ) ( day_value - 1 );
Toto přetypování se doporučuje v jazyce C, ale není povinné.
enum BOOLEAN /* Declares an enumeration data type called BOOLEAN */
{
false, /* false = 0, true = 1 */
true
};
enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */
Tuto deklaraci lze také zadat jako
enum BOOLEAN { false, true } end_flag, match_flag;
nebo jako
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
Příklad, který používá tyto proměnné, může vypadat takto:
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
Nenájmenované datové typy enumerátoru lze deklarovat také. Název datového typu je vynechán, ale proměnné lze deklarovat. Proměnná je proměnná response definovaného typu:
enum { yes, no } response;