ไวยากรณ์
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;
}
ตัวอย่างที่ 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;
}
ตัวอย่างที่ 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;
}
ตัวอย่างที่ 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 มากกว่ามาโครสำหรับโครงการพัฒนาซอฟต์แวร์ขนาดใหญ่ ซึ่งช่วยในการเขียนโปรแกรมที่สะอาดและอ่านได้