Kako koristiti enum u C jeziku

How Use Enum C Language



Program enum u programskom jeziku C koristi se za definiranje integralnih konstantnih vrijednosti, što je vrlo korisno pri pisanju čistih i čitljivih programa. Programeri obično koriste nabrajanje kako bi definirali imenovane integralne konstante u svojim programima kako bi osigurali bolju čitljivost i održavanje softvera. U ovom članku će se detaljno govoriti o enumu.

Sintaksa

nabrojati <Naziv vrste nabrajanja> {
Enumeration_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).







Uronite duboko u Enum

Sada, budući da znamo sintaksu za definiranje vrste nabrajanja, pogledajmo primjer:



nabrojatiPogreška{
IO_ERROR,
DISK_ERROR,
POGREŠKA MREŽE
};

Ključna riječ enum uvijek se mora koristiti za definiranje vrste nabrajanja. Dakle, kad god želite definirati vrstu popisivanja, morate prije toga koristiti ključnu riječ enum. Nakon ključne riječi enum, morate koristiti valjani identifikator za definiranje.



U gornjem primjeru, prevoditelj će dodijeliti IO_ERROR integralnoj vrijednosti: 0, DISK_ERROR integralnoj vrijednosti: 1 i NETWORK_ERROR integralnoj vrijednosti: 2. Prema zadanim postavkama, prvom enum-elementu uvijek se dodjeljuje vrijednost 0, sljedećem enum-element dodjeljuje vrijednost 1, i tako dalje.





Ovo zadano ponašanje može se promijeniti ako je potrebno dodjeljivanjem konstantne integralne vrijednosti izričito, kako slijedi:

nabrojatiPogreška{
IO_ERROR= 2,
DISK_ERROR,
POGREŠKA MREŽE= 8 ,
PRINT_POGREŠKA
};

U ovom slučaju programer izričito dodjeljuje IO_ERROR vrijednosti 2, prevoditelj DISK_ERROR dodjeljuje vrijednosti 3, programer NETWORK_ERROR izričito dodjeljuje vrijednost 8, a sljedećoj PRINT_ERROR dodjeljuje sljedeću integralna vrijednost prethodnog elementa nabrajanja NETWORK_ERROR (tj. 9) od strane prevoditelja.



Dakle, sada razumijete kako definirati korisnički definiranu vrstu nabrajanja u C. Je li moguće deklarirati varijablu tipa nabrajanja (kao što možemo proglasiti varijablu cijelog broja)? Da je! Enum varijablu možete deklarirati na sljedeći način:

nabrojatiPogreška Hw_Error;

Opet, enum je ključna riječ ovdje, Error je tip enuma, a Hw_Error je varijabla enuma.

Sada ćemo pogledati sljedeće primjere kako bismo razumjeli različite upotrebe enuma:

  • Primjer 1: Korištenje zadane enum definicije
  • Primjer 2: Upotreba prilagođene definicije nabrajanja
  • Primjer 3: definicija nabrajanja pomoću konstantnog izraza
  • Primjer 4: opseg nabrajanja

Primjer 1: Zadana upotreba definicije nabrajanja

U ovom primjeru naučit ćete kako definirati tip popisivanja sa zadanim vrijednostima konstante. Prevodilac će se pobrinuti za dodjeljivanje zadanih vrijednosti elementima enum. U nastavku ćete vidjeti primjer programa i odgovarajući izlaz.

#uključi

/ * Definirajte vrstu nabrajanja */
nabrojatiPogreška{
IO_ERROR,
DISK_ERROR,
POGREŠKA MREŽE
};

intglavni()
{
nabrojatiPogreška Hw_Error; /* Stvaranje 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=POGREŠKA MREŽE;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

povratak 0;
}

https://lh6.googleusercontent.com/0CHtUqkuIA-okDEPI0_5fZLU6lZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBWoiMOhzApzXey4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBVoiMOhzAQPzXey4

Primjer 2: Upotreba definicije prilagođenog popisa

U ovom primjeru naučit ćete kako definirati vrstu popisivanja s prilagođenom konstantnom vrijednošću. Također, ovaj će vam primjer pomoći da razumijete kako se inicijalizacija prilagođenih konstanti može obaviti bilo kojim slučajnim redoslijedom. U ovom primjeru izričito smo definirali konstantnu vrijednost za 1svi 3rdenum elementi (tj. IO_ERROR i NETWORK_ERROR), ali preskočili smo eksplicitnu inicijalizaciju za 2ndi 4thelementi. Sada je odgovornost prevoditelja da dodijeli zadane vrijednosti 2ndi 4thenum elementi (tj. DISK_ERROR i PRINT_ERROR). DISK_ERROR će biti dodijeljen na vrijednost 3, a PRINT_ERROR na vrijednost 9. Ispod ćete vidjeti primjer programa i izlaz.

#uključi

/* Definirajte vrstu nabrajanja - Prilagođena inicijalizacija*/
nabrojatiPogreška{
IO_ERROR= 2,
DISK_ERROR,
POGREŠKA MREŽE= 8,
PRINT_POGREŠKA
};

intglavni()
{

/* Deklariraj varijablu nabrajanja*/
nabrojatiPogreš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=POGREŠKA MREŽE;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

printf (' nPostavljanje Hw_Error na PRINT_ERROR n');
Hw_Error=PRINT_POGREŠKA;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

povratak 0;
}

https://lh6.googleusercontent.com/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqlBLy6wxxw

Primjer 3: Definicija nabrajanja pomoću konstantnog izraza

U ovom primjeru naučit ćete kako koristiti konstantni izraz za definiranje konstantne vrijednosti za elemente enuma.

#uključi

/* Definirajte tip enuma - prilagođena inicijalizacija pomoću konstantnog izraza
ovdje se koristi stalan izraz u slučaju:
a. IO_ERROR i
b. POGREŠKA MREŽE
Ovo je neobičan način definiranja enum elemenata; međutim, ovo
program pokazuje da je ovaj način inicijalizacije elemenata nabrajanja moguć u c.
* /


nabrojatiPogreška{
IO_ERROR= 1 + 2 * 3 + 4,
DISK_ERROR,
POGREŠKA MREŽE= 2 == 2,
PRINT_POGREŠKA
};

intglavni()
{

/* Deklariraj varijablu nabrajanja*/
nabrojatiPogreš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=POGREŠKA MREŽE;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

printf (' nPostavljanje Hw_Error na PRINT_ERROR n');
Hw_Error=PRINT_POGREŠKA;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

povratak 0;
}

https://lh4.googleusercontent.com/9FAbPOnM95LiP_UQvg40oHSW4sv34aqpFgasbHMiy06Z_rKEom81TuMCVsfxWaZedtQOMEQx7ef_5qEfRVcNrUvhitDzOcOc4c4c4c4c4c8c8c4c8c8c8c8c8c8c8c6c6c6c6c6c8c7c8c76e78

Primjer 4: enum Scope

U ovom primjeru naučit ćete kako pravilo opsega funkcionira za enum. MACRO (#define) mogao se koristiti za definiranje konstante umjesto nabrajanja, ali pravilo opsega ne radi za MACRO.

#uključi

intglavni()
{

/ * Definirajte vrstu nabrajanja */
nabrojatiPogreška_1{
IO_ERROR= 10,
DISK_ERROR,
POGREŠKA MREŽE= 3,
PRINT_POGREŠKA
};


{

/* Definirajte tip enuma u unutarnjem opsegu*/
nabrojatiPogreška_1{
IO_ERROR= dvadeset,
DISK_ERROR,
POGREŠKA MREŽE= 35,
PRINT_POGREŠKA
};

/* Deklariraj varijablu nabrajanja*/
nabrojatiPogreška_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 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=POGREŠKA MREŽE;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);

printf (' nPostavljanje Hw_Error na PRINT_ERROR n');
Hw_Error=PRINT_POGREŠKA;
printf ('Vrijednost Hw_Error = %d n',Hw_Error);
}
povratak 0;
}

Usporedba između enuma i makronaredbe

Enum Makro
Za enum je primjenjivo pravilo opsega. Pravilo opsega nije primjenjivo za Makro.
Zadana dodjela vrijednosti nabrajanja događa se automatski.

Enum je od velike pomoći pri definiranju velikog broja konstanti. Prevoditelj preuzima zadanu inicijalizaciju konstantne vrijednosti.

Vrijednosti makro konstante programer uvijek mora izričito spomenuti.

Ovo bi mogao biti dosadan proces za veliki broj konstanti budući da programer uvijek mora ručno definirati svaku konstantnu vrijednost dok definira makro.

Zaključak

Program nabrajanja u jeziku C mogao bi se smatrati neobaveznom metodom za samostalne programe ili projekte male veličine budući da programeri uvijek mogu koristiti makro umjesto nabrajanja. Međutim, iskusni programeri obično koriste enum over macro za velike projekte razvoja softvera. To pomaže u pisanju čistih i čitljivih programa.