Deklarace výčtů v jazyce C
Výčet se skládá ze sady pojmenovaných celočíselných konstant. Deklarace typu výčtu poskytuje název (volitelné) značky výčtu. A definuje množinu pojmenovaných celočíselných identifikátorů (nazývá se sada výčtů, konstanty výčtu, enumerátory nebo členy). Proměnná typu výčtu ukládá jednu z hodnot výčtové sady definované tímto typem.
Proměnné typu enum
lze použít ve výrazech indexování a jako operandy všech aritmetických a relačních operátorů. Výčty poskytují alternativu k direktivě #define
preprocesoru s výhodami, že hodnoty mohou být generovány pro vás a dodržovat normální pravidla oborů.
V JAZYCE ANSI C mají int
výrazy definující hodnotu konstanty výčtu vždy typ. To znamená, že úložiště přidružené k proměnné výčtu je úložiště vyžadované pro jednu int
hodnotu. Konstantu výčtu nebo hodnotu výčtového typu lze použít všude, kde jazyk C povoluje celočíselný výraz.
Syntax
enum-specifier
:
enum
identifier
Rozhodnout{
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 nástrojem enumerator-list
. Tento identifikátor se často nazývá "značka" výčtu určeného seznamem. Specifikátor typu deklaruje identifier
, že je značka výčtu určeného enumerator-list
neterminálem, jak je vidět tady:
enum identifier
{
// enumerator-list
}
Definuje enumerator-list
členy sady výčtu.
Pokud je deklarace značky viditelná, pozdější deklarace, které značku používají, ale vynechat enumerator-list
, určují dříve deklarovaný typ výčtu. 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 objektu enumerator-list
pojmenuje hodnotu sady výčtu. Ve výchozím nastavení je první enumeration-constant
přidružený k hodnotě 0. Další enumeration-constant
položka v seznamu je přidružená k hodnotě ( constant-expression
+ 1 ), pokud ji explicitně nepřidružíte k jiné hodnotě. Název objektu enumeration-constant
je ekvivalentní jeho hodnotě.
Pomocí příkazu můžete enumeration-constant
= constant-expression
přepsat výchozí sekvenci hodnot. To znamená, že pokud enumeration-constant
= constant-expression
se zobrazí v enumerator-list
, enumeration-constant
je přidružena k hodnotě zadané hodnotou .constant-expression
Musí constant-expression
mít int
typ a může být negativní.
Následující pravidla platí pro členy výčtové sady:
Sada výčtů může obsahovat duplicitní konstantní hodnoty. Hodnotu 0 můžete například přidružit ke dvěma různým identifikátorům, například členům s názvem
null
azero
, ve stejné sadě.Identifikátory v seznamu výčtu 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ýčtu.
Výčtové značky se řídí normálními pravidly 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
k. 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 hodnota ze sady DAY
přiřazena proměnné today
.
enum DAY today = wednesday;
Název konstanty výčtu slouží 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;
Lze také deklarovat nepojmenované datové typy enumerátoru. Název datového typu je vynechán, ale proměnné lze deklarovat. Proměnná response
je proměnná definovaného typu:
enum { yes, no } response;
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro