วิธีใช้ enum ในภาษาซี

How Use Enum C Language



โปรแกรม enum ในภาษาซีใช้เพื่อกำหนดค่าคงที่อินทิกรัล ซึ่งมีประโยชน์มากในการเขียนโปรแกรมที่สะอาดและอ่านได้ โปรแกรมเมอร์มักใช้การแจงนับเพื่อกำหนดค่าคงที่อินทิกรัลที่มีชื่อในโปรแกรมของตน เพื่อให้ซอฟต์แวร์อ่านง่ายขึ้นและบำรุงรักษาได้ บทความนี้จะกล่าวถึงรายละเอียดเกี่ยวกับ enum

ไวยากรณ์

enum <Enum ประเภท Name> {
การแจงนับ_ค่าคงที่_องค์ประกอบ-1,
การแจงนับ_ค่าคงที่_องค์ประกอบ-2,
การแจงนับ_ค่าคงที่_องค์ประกอบ-3,
…… .........,
การแจงนับ_ค่าคงที่_องค์ประกอบ-NS,
};

ค่าเริ่มต้นของ Enumeration_Constant_Element-1 คือ 0 ค่าของ Enumeration_Constant_Element-2 คือ 1 ค่าของ Enumeration_Constant_Element-3 คือ 2 และค่าของ Enumeration_Constant_Element-n คือ (n-1)







เจาะลึก Enum

ตอนนี้ เนื่องจากเรารู้ไวยากรณ์เพื่อกำหนดประเภทการแจงนับแล้ว เรามาดูตัวอย่างกัน:



enumข้อผิดพลาด{
IO_ERROR,
DISK_ERROR,
NETWORK_ERROR
};

ต้องใช้คีย์เวิร์ด enum เพื่อกำหนดประเภทการแจงนับเสมอ ดังนั้น เมื่อใดก็ตามที่คุณต้องการกำหนดประเภทการแจงนับ คุณต้องใช้คีย์เวิร์ด enum ก่อน หลังจากคีย์เวิร์ด enum คุณต้องใช้ตัวระบุที่ถูกต้องเพื่อกำหนด .



ในตัวอย่างข้างต้น คอมไพเลอร์จะกำหนด IO_ERROR ให้กับค่าอินทิกรัล: 0, DISK_ERROR ให้กับค่าอินทิกรัล: 1 และ NETWORK_ERROR ให้กับค่าอินทิกรัล: 2 โดยค่าเริ่มต้น องค์ประกอบ enum แรกจะถูกกำหนดค่าเป็น 0 เสมอ enum-element ถูกกำหนดเป็นค่า 1 และอื่นๆ





พฤติกรรมเริ่มต้นนี้สามารถเปลี่ยนแปลงได้หากจำเป็นโดยการกำหนดค่าอินทิกรัลคงที่อย่างชัดเจนดังนี้:

enumข้อผิดพลาด{
IO_ERROR= 2,
DISK_ERROR,
NETWORK_ERROR= 8 ,
PRINT_ERROR
};

ในกรณีนี้ IO_ERROR ถูกกำหนดอย่างชัดเจนให้กับค่า 2 โดยโปรแกรมเมอร์ DISK_ERROR ถูกกำหนดเป็น 3 โดยคอมไพเลอร์ NETWORK_ERROR ถูกกำหนดอย่างชัดเจนให้กับค่า 8 โดยโปรแกรมเมอร์ และ PRINT_ERROR ถูกกำหนดให้กับค่าถัดไป ค่าอินทิกรัลขององค์ประกอบ enum ก่อนหน้า NETWORK_ERROR (เช่น 9) โดยคอมไพเลอร์



ตอนนี้คุณเข้าใจวิธีกำหนดประเภทการแจงนับที่ผู้ใช้กำหนดใน C แล้ว เป็นไปได้ไหมที่จะประกาศตัวแปรประเภท enum (เนื่องจากเราสามารถประกาศตัวแปรประเภทจำนวนเต็มได้) ใช่แล้ว! คุณสามารถประกาศตัวแปร enum ได้ดังนี้:

enumข้อผิดพลาด Hw_Error;

อีกครั้ง enum เป็นคีย์เวิร์ดที่นี่ Error คือประเภท enum และ Hw_Error เป็นตัวแปร enum

ตอนนี้เราจะมาดูตัวอย่างต่อไปนี้เพื่อทำความเข้าใจการใช้งานต่างๆ ของ enum:

  • ตัวอย่างที่ 1: การใช้ข้อกำหนด enum เริ่มต้น
  • ตัวอย่างที่ 2: การใช้ข้อกำหนด enum แบบกำหนดเอง
  • ตัวอย่างที่ 3: นิยาม enum โดยใช้นิพจน์คงที่
  • ตัวอย่างที่ 4: ขอบเขต enum

ตัวอย่างที่ 1: ค่าเริ่มต้น enum คำจำกัดความ การใช้

ในตัวอย่างนี้ คุณจะได้เรียนรู้วิธีกำหนดประเภทการแจงนับด้วยค่าคงที่เริ่มต้น คอมไพเลอร์จะดูแลการกำหนดค่าเริ่มต้นให้กับองค์ประกอบ enum ด้านล่าง คุณจะเห็นโปรแกรมตัวอย่างและผลลัพธ์ที่เกี่ยวข้อง

#รวม

/* กำหนดประเภท enum */
enumข้อผิดพลาด{
IO_ERROR,
DISK_ERROR,
NETWORK_ERROR
};

intหลัก()
{
enumข้อผิดพลาด Hw_Error; /* การสร้างตัวแปร enum*/

printf ('กำลังตั้งค่า Hw_Error เป็น IO_ERRORNS');
Hw_Error=IO_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น DISK_ERRORNS');
Hw_Error=DISK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น NETWORK_ERRORNS');
Hw_Error=NETWORK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

กลับ 0;
}

https://lh6.googleusercontent.com/0CHtUqkuIA-okDEPI0_5fZLU6lZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBVoiMOhzPzVQXey4fZB

ตัวอย่างที่ 2: กำหนดเอง enum คำจำกัดความการใช้งาน

ในตัวอย่างนี้ คุณจะได้เรียนรู้วิธีกำหนดประเภทการแจงนับด้วยค่าคงที่ที่กำหนดเอง นอกจากนี้ ตัวอย่างนี้จะช่วยให้คุณเข้าใจว่าการกำหนดค่าเริ่มต้นของค่าคงที่แบบกำหนดเองสามารถทำได้ในลำดับแบบสุ่มอย่างไร ในตัวอย่างนี้ เราได้กำหนดค่าคงที่สำหรับ 1 . ไว้อย่างชัดเจนเซนต์และ 3rdองค์ประกอบ enum (เช่น IO_ERROR และ NETWORK_ERROR ตามลำดับ) แต่เราข้ามการเริ่มต้นที่ชัดเจนสำหรับ 2NSและ 4NSองค์ประกอบ ตอนนี้เป็นความรับผิดชอบของคอมไพเลอร์ในการกำหนดค่าเริ่มต้นให้กับ2NSและ 4NSองค์ประกอบ enum (เช่น DISK_ERROR และ PRINT_ERROR ตามลำดับ) DISK_ERROR จะถูกกำหนดค่าเป็น 3 และ PRINT_ERROR จะถูกกำหนดค่าเป็น 9 ด้านล่าง คุณจะเห็นโปรแกรมตัวอย่างและผลลัพธ์

#รวม

/* กำหนดประเภท enum - การกำหนดค่าเริ่มต้นแบบกำหนดเอง*/
enumข้อผิดพลาด{
IO_ERROR= 2,
DISK_ERROR,
NETWORK_ERROR= 8,
PRINT_ERROR
};

intหลัก()
{

/* ประกาศตัวแปร enum*/
enumข้อผิดพลาด Hw_Error;

printf ('กำลังตั้งค่า Hw_Error เป็น IO_ERRORNS');
Hw_Error=IO_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น DISK_ERRORNS');
Hw_Error=DISK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น NETWORK_ERRORNS');
Hw_Error=NETWORK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น PRINT_ERRORNS');
Hw_Error=PRINT_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

กลับ 0;
}

https://lh6.googleusercontent.com/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqlBLy6wzxvr04F-FUwDafKafVafKafKafKafKafKaf

ตัวอย่างที่ 3: นิยาม Enum โดยใช้นิพจน์คงที่

ในตัวอย่างนี้ คุณจะได้เรียนรู้วิธีใช้นิพจน์คงที่เพื่อกำหนดค่าคงที่สำหรับองค์ประกอบ enum

#รวม

/* กำหนดประเภท enum - การกำหนดค่าเริ่มต้นแบบกำหนดเองโดยใช้นิพจน์คงที่
มีการใช้นิพจน์คงที่ที่นี่ในกรณีที่:
NS. IO_ERROR และ
NS. NETWORK_ERROR
นี่เป็นวิธีที่ผิดปกติในการกำหนดองค์ประกอบ enum อย่างไรก็ตามสิ่งนี้
โปรแกรมแสดงให้เห็นว่าวิธีการเริ่มต้นองค์ประกอบ enum นี้เป็นไปได้ในค
* /


enumข้อผิดพลาด{
IO_ERROR= 1 + 2 * 3 + 4,
DISK_ERROR,
NETWORK_ERROR= 2 == 2,
PRINT_ERROR
};

intหลัก()
{

/* ประกาศตัวแปร enum*/
enumข้อผิดพลาด Hw_Error;

printf ('กำลังตั้งค่า Hw_Error เป็น IO_ERRORNS');
Hw_Error=IO_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น DISK_ERRORNS');
Hw_Error=DISK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น NETWORK_ERRORNS');
Hw_Error=NETWORK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น PRINT_ERRORNS');
Hw_Error=PRINT_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

กลับ 0;
}

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

ตัวอย่างที่ 4: enum ขอบเขต

ในตัวอย่างนี้ คุณจะได้เรียนรู้วิธีการทำงานของกฎการกำหนดขอบเขตสำหรับ enum สามารถใช้ MACRO (#define) เพื่อกำหนดค่าคงที่แทน enum ได้ แต่กฎการกำหนดขอบเขตใช้ไม่ได้กับ MACRO

#รวม

intหลัก()
{

/* กำหนดประเภท enum */
enumError_1{
IO_ERROR= 10,
DISK_ERROR,
NETWORK_ERROR= 3,
PRINT_ERROR
};


{

/* กำหนดประเภท enum ในขอบเขตภายใน*/
enumError_1{
IO_ERROR= ยี่สิบ,
DISK_ERROR,
NETWORK_ERROR= 35,
PRINT_ERROR
};

/* ประกาศตัวแปร enum*/
enumError_1 Hw_Error;
printf ('กำลังตั้งค่า Hw_Error เป็น IO_ERRORNS');
Hw_Error=IO_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น DISK_ERRORNS');
Hw_Error=DISK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น NETWORK_ERRORNS');
Hw_Error=NETWORK_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);

printf ('NSการตั้งค่า Hw_Error เป็น PRINT_ERRORNS');
Hw_Error=PRINT_ERROR;
printf ('ค่าของ Hw_Error = %dNS',Hw_Error);
}
กลับ 0;
}

การเปรียบเทียบระหว่าง enum และมาโคร

เอนุม มาโคร
กฎการกำหนดขอบเขตใช้ได้กับ enum กฎการกำหนดขอบเขตไม่สามารถใช้ได้กับมาโคร
การกำหนดค่าเริ่มต้น Enum เกิดขึ้นโดยอัตโนมัติ

Enum มีประโยชน์มากในการกำหนดค่าคงที่จำนวนมาก คอมไพเลอร์ใช้ค่าเริ่มต้นของค่าคงที่เริ่มต้น

โปรแกรมเมอร์ต้องระบุค่าคงที่มาโครอย่างชัดเจนเสมอ

นี่อาจเป็นกระบวนการที่น่าเบื่อสำหรับค่าคงที่จำนวนมาก เนื่องจากโปรแกรมเมอร์ต้องกำหนดค่าคงที่แต่ละค่าด้วยตนเองในขณะที่กำหนดมาโคร

บทสรุป

โปรแกรม enum ใน C อาจถือเป็นวิธีการทางเลือกสำหรับโปรแกรมแบบสแตนด์อโลนหรือโครงการขนาดเล็ก เนื่องจากโปรแกรมเมอร์สามารถใช้มาโครแทน enum ได้เสมอ อย่างไรก็ตาม โปรแกรมเมอร์ที่มีประสบการณ์มักจะใช้ enum มากกว่ามาโครสำหรับโครงการพัฒนาซอฟต์แวร์ขนาดใหญ่ ซึ่งช่วยในการเขียนโปรแกรมที่สะอาดและอ่านได้