Nejlepší odpověď
Za předpokladu, že chcete sizeof (E), kde E je typ výčtu:
Záleží na podkladovém typu. Normálně je to int, ale pokud použijete enum class
, můžete to zadat v C ++. Ať tak či onak, sizeof by měl dát správnou hodnotu.
Neexistuje žádný standardní nebo vestavěný způsob, jak určit počet enumerandů v C nebo C ++. Pokud jste disciplinovaní a nemáte mezery, můžete použít něco podobného: každý výčet kromě prvního by měl být o jeden vyšší než jeho předchůdce:
enum Days { Monday, Tuesday, … Saturday, LAST };
Zde je počet dní stejný jako int hodnota LAST, ale samozřejmě musíte zajistit, že POSLEDNÍ je skutečně poslední. Kompilátor to nemůže vynutit.
Pokud nezačínáte na nule, ale z nějakého důvodu začínáte na 7, můžete vypočítat POSLEDNÍ – pondělí:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Také se ujistěte, že Pondělí zůstane první .
Odpověď
Výčet (zkratka pro výčet ) je technika pro přidávání nějakého významu číslům. Počítače jsou omezeny na práci pouze v číslech a výčty předstírají, že tato čísla popisují spíše kvalitu než kvantitu.
Jedním z nejznámějších výčtů je kódování, které používáme pro ukládání textu. Myšlenka spočívá v přidělení čísla každému z našich písmen, a to takovým způsobem, že kniha pro děti napíše číselný kód. Kód, který používáme, vypadá asi takto:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Pokud používáte počítač se systémem Windows, zkuste toto: Klikněte někam, kde můžete psát text. Podržte klávesu ALT a podržte jej, zadejte jedno z těchto čísel na číselnou klávesnici. Například [Stiskněte a podržte Alt] 65 [Uvolněte Alt]. Zobrazí se písmeno A. Jedná se o opravdu starou metodu zadávání znaků přímo jejich číselný kód. Je to většinou užitečné pro psaní mezinárodních znaků, když nemáte nainstalovanou správnou klávesnici: Çüéâäàåçê … to, co dostanu od Alt + 128, 129, 130 atd. To je způsob, jak vystavit základní výčet znaků.
Není nic kouzelného na zvolení čísla 65 ve smyslu A; důležité je pouze to, že jsme důslední. Výčet tedy představuje metodu přiřazování čísel k nečíselným nápadům a usnadňuje práci s kódem.
Nezapomeňte, že je užitečné, že řazení znaků odpovídá abecednímu pořadí (alespoň v angličtině). To usnadňuje psaní řetězcových řazení, která třídí věci do abecedního pořadí, protože můžete podvádět a používat srovnání s číselnou hodnotou. V jiných jazycích je to trochu složitější, protože číselné hodnoty přiřazené znakům se vždy neshodují s abecedním řazením.
Pro další příklad výčtu předpokládejme, že píšeme program, který se bude zabývat se síťovými připojeními. Síťová připojení mohou mít několik různých stavů; mohou naslouchat , otevřít , zavřeno nebo ve stavu chyby . Jedná se o vlastnosti, nikoli o množství, a k tomu je výčet:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Podle mého názoru je obvykle lepší vložit vaše výčty do definice třídy. To vám umožní přeskočit předpony:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Typ je Connection::State
a hodnoty jsou Connection::LISTEN
, Connection::OPEN
atd. Myslím, že je to jasnější.
Váš příklad míchání číselných hodnot a hodnot výčtu není “ Dává to smysl; všechny vyjmenované hodnoty musí začínat písmenem. Obvykle nemůžete použít číslo, kde se očekává výčet; Překladače v C ++ považují ints a enums za různé typy. Není zakázáno mít smysluplná čísla spojená s hodnotami výčtu (všimněte si, jak je to užitečné pro abecední pořadí), ale není to výchozí postup.
Můžete vytvořit nebo zadat výčet? Určitě můžete , ale protože se jedná o vlastní typ, budete k tomu muset napsat vlastní operátory >> a < Můžete buď zadat ekvivalentní celočíselnou hodnotu, nebo můžete napsat kód pro převod do / z řetězce, který odpovídá text výčtu. Není však triviální to podporovat.