Sintaksa
nabrajanjeEnumeration_Constant_Element-1,
Enumeration_Constant_Element-2,
Enumeration_Constant_Element-3,
.. ,
Enumeration_Constant_Element-n,
;
Zadana vrijednost Enumeration_Constant_Element-1 je 0, vrijednost Enumeration_Constant_Element-2 je 1, vrijednost Enumeration_Constant_Element-3 je 2, a vrijednost Enumeration_Constant_Element-n je (n-1).
Duboko zaronite u Enum
Sada, budući da znamo sintaksu da definiramo tip nabrajanja, pogledajmo primjer:
enum pogreškaIO_ERROR,
DISK_ERROR,
POGREŠKA MREŽE
;
Ključna riječ "enum" uvijek se mora koristiti za definiranje vrste popisivanja. Dakle, kad god želite definirati vrstu nabrajanja, prije toga morate upotrijebiti ključnu riječ "enum"
U gornjem primjeru, kompajler će dodijeliti IO_ERROR integralnoj vrijednosti: 0, DISK_ERROR integralnoj vrijednosti: 1 i NETWORK_ERROR integralnoj vrijednosti: 2. Prema zadanim postavkama prvom elementu nabrajanja uvijek se dodjeljuje vrijednost 0, sljedećem elementu nabrajanja dodjeljuje se vrijednost 1 i tako dalje.
To se zadano ponašanje može promijeniti ako je potrebno eksplicitnim dodjeljivanjem konstantne integralne vrijednosti, kako slijedi:
enum pogreškaIO_ERROR = 2,
DISK_ERROR,
GREŠKA_MREŽE = 8 ,
PRINT_ERROR
;
U ovom je slučaju programer eksplicitno dodijelio vrijednost IO_ERROR vrijednosti 2, DISK_ERROR programer dodijelio vrijednosti 3, NETWORK_ERROR programer eksplicitno dodijelio vrijednosti 8, a sljedećem PRINT_ERROR integralna vrijednost prethodnog elementa nabrajanja NETWORK_ERROR (i.e., 9) od strane sastavljača.
Dakle, sada razumijete kako definirati korisnički definirani tip nabrajanja u C-u. Je li moguće deklarirati varijablu enum tipa (kao što možemo deklarirati varijablu cijelog broja)? Da je! Varijablu enum možete deklarirati na sljedeći način:
enum Greška Hw_Error;Opet, “enum” je ovdje ključna riječ, “Error” je vrsta enum, a “Hw_Error” je enum varijabla.
Sada ćemo razmotriti sljedeće primjere kako bismo razumjeli različite upotrebe enum:
- Primjer 1: Zadana upotreba definicije nabrajanja
- Primjer 2: Uporaba prilagođene definicije nabrajanja
- Primjer 3: definicija nabrajanja pomoću konstantnog izraza
- Primjer 4: opseg nabrajanja
Primjer 1: Primjena definicije zadanog popisa
U ovom ćete primjeru naučiti kako definirati tip nabrajanja sa zadanim konstantnim vrijednostima. Prevoditelj će se pobrinuti za dodjeljivanje zadanih vrijednosti elementima nabrajanja. Ispod ćete vidjeti primjer programa i odgovarajući izlaz.
#include/ * Definirajte vrstu nabrajanja * /
enum pogreška
IO_ERROR,
DISK_ERROR,
POGREŠKA MREŽE
;
int main ()
enum Greška Hw_Error; / * Izrada enum varijable * /
printf ("Postavljanje Hw_Error na IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
return 0;
Primjer 2: Uporaba prilagođene enum definicije
U ovom ćete primjeru naučiti kako definirati tip nabrajanja s prilagođenom konstantnom vrijednošću. Također, ovaj će vam primjer pomoći da shvatite kako se inicijalizacija prilagođenih konstanti može izvršiti bilo kojim slučajnim redoslijedom. U ovom smo primjeru izričito definirali konstantnu vrijednost za 1sv i 3rd elementi nabrajanja (i.e., IO_ERROR odnosno NETWORK_ERROR), ali smo preskočili eksplicitnu inicijalizaciju za 2nd i 4th elementi. Sada je odgovornost kompajlera dodijeliti zadane vrijednosti 2nd i 4th elementi nabrajanja (i.e., DISK_ERROR i PRINT_ERROR). DISK_ERROR dodijelit će se vrijednosti 3, a PRINT_ERROR dodijelit će se vrijednosti 9. Ispod ćete vidjeti primjer programa i rezultate.
#include/ * Odredite vrstu nabrajanja - Prilagođena inicijalizacija * /
enum pogreška
IO_ERROR = 2,
DISK_ERROR,
GREŠKA_MREŽE = 8,
PRINT_ERROR
;
int main ()
/ * Izjavi varijablu nabrajanja * /
enum Greška Hw_Error;
printf ("Postavljanje Hw_Error na IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
return 0;
Primjer 3: Definicija enuma pomoću konstantnog izraza
U ovom ćete primjeru naučiti kako koristiti konstantni izraz za definiranje konstantne vrijednosti za elemente nabrajanja.
#include/ * Definirajte tip nabrajanja - prilagođena inicijalizacija pomoću konstantnog izraza
ovdje se koristi konstantni izraz u slučaju:
a. IO_ERROR i
b. POGREŠKA MREŽE
Ovo je neobičan način definiranja elemenata nabrajanja; međutim ovo
program pokazuje da je ovaj način inicijalizacije elemenata nabrajanja moguć u c.
* /
enum pogreška
IO_ERROR = 1 + 2 * 3 + 4,
DISK_ERROR,
GREŠKA MREŽE = 2 == 2,
PRINT_ERROR
;
int main ()
/ * Izjavi varijablu nabrajanja * /
enum Greška Hw_Error;
printf ("Postavljanje Hw_Error na IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje pogreške Hw_Error na DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
return 0;
Primjer 4: enum Opseg
U ovom ćete primjeru naučiti kako pravilo opsega djeluje za enum. MACRO (#define) se mogao koristiti za definiranje konstante umjesto nabrajanja, ali pravilo opsega ne radi za MACRO.
#includeint main ()
/ * Definirajte vrstu nabrajanja * /
enum Greška_1
IO_ERROR = 10,
DISK_ERROR,
NETWORK_ERROR = 3,
PRINT_ERROR
;
/ * Definirajte tip nabrajanja u unutarnjem opsegu * /
enum Greška_1
IO_ERROR = 20,
DISK_ERROR,
GREŠKA_MREŽE = 35,
PRINT_ERROR
;
/ * Izjavi varijablu nabrajanja * /
enum Error_1 Hw_Error;
printf ("Postavljanje Hw_Error na IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje pogreške Hw_Error na DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
printf ("\ nPostavljanje Hw_Error na PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Vrijednost Hw_Error =% d \ n", Hw_Error);
return 0;
Usporedba broja i makronaredbe
Enum | Makro |
Za enum vrijedi pravilo opsega. | Pravilo opsega nije primjenjivo za makronaredbe. |
Zadana dodjela vrijednosti Enum događa se automatski. Enum je vrlo koristan u definiranju velikog broja konstanti. Prevoditelj uzima zadanu inicijalizaciju konstantne vrijednosti. | Vrijednosti konstante makronaredbe programer mora uvijek izričito spomenuti. To bi mogao biti naporan postupak za velik broj konstanti, jer programer uvijek mora ručno definirati svaku konstantnu vrijednost dok definira Makronaredbu. |
Zaključak
Enum program na C-u mogao bi se smatrati neobaveznom metodom za samostalne programe ili male projekte, jer programeri uvijek mogu koristiti makronaredbu umjesto enum-a. Međutim, iskusni programeri obično koriste enum nad makronaredbama za velike projekte razvoja softvera. To pomaže u pisanju čistih i čitljivih programa.