Jaká je velikost výčtu?


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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *