เมื่อประกาศ enum ตามที่แสดงด้านล่างคอมไพเลอร์ C ทั้งหมดตั้งค่าเริ่มต้นเป็นx=0
หรือy=1
ไม่และz=2
ทั้งบนระบบ Linux และ Windows
typedef enum {
x,
y,
z
} someName;
เมื่อประกาศ enum ตามที่แสดงด้านล่างคอมไพเลอร์ C ทั้งหมดตั้งค่าเริ่มต้นเป็นx=0
หรือy=1
ไม่และz=2
ทั้งบนระบบ Linux และ Windows
typedef enum {
x,
y,
z
} someName;
คำตอบ:
ใช่. เว้นแต่คุณจะระบุเป็นอย่างอื่นในนิยามของการแจงนับตัวนับเริ่มต้นจะมีค่าเป็นศูนย์เสมอและค่าของตัวแจงนับแต่ละตัวที่ตามมาจะมากกว่าตัวแจงนับก่อนหน้า
[dcl.enum]
: "ถ้าตัวแจงนับตัวแรกไม่มีตัวเริ่มต้นค่าของค่าคงที่ที่เกี่ยวข้องจะเป็นศูนย์คำนิยามตัวนับที่ไม่มีตัวเริ่มต้นจะทำให้ตัวแจงนับค่าที่ได้รับจากการเพิ่มค่าของตัวแจงนับก่อนหน้าทีละตัว"
มาตรฐาน C99
N1265 C99 ร่างกล่าวว่าที่ 6.7.2.2/3 "specifiers การแจงนับ"
ตัวแจงนับที่มี = กำหนดค่าคงที่การแจงนับเป็นค่าของนิพจน์คงที่ ถ้าตัวแจงนับตัวแรกไม่มี
=
ค่าของค่าคงที่การแจงนับคือ 0 ตัวนับที่ตามมาแต่ละตัวที่มี no = กำหนดค่าคงที่การแจงนับเป็นค่าของนิพจน์คงที่ที่ได้จากการเพิ่ม 1 ให้กับค่าของค่าคงที่การแจงนับก่อนหน้า (การใช้ตัวนับที่มี = อาจสร้างค่าคงที่การแจงนับด้วยค่าที่ซ้ำกับค่าอื่น ๆ ในการแจงนับเดียวกัน)
ดังนั้นสิ่งต่อไปนี้จะยึดมั่นในการปฏิบัติตามเสมอ
main.c
#include <assert.h>
#include <limits.h>
enum E {
E0,
E1,
E2 = 3,
E3 = 3,
E4,
E5 = INT_MAX,
#if 0
/* error: overflow in enumeration values */
E6,
#endif
};
int main(void) {
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
/* Repeated number, no problem. */
assert(E2 == 3);
assert(E3 == 3);
/* Continue from the last one. */
assert(E4 == 4);
assert(E5 == INT_MAX);
return 0;
}
รวบรวมและเรียกใช้:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
ทดสอบใน Ubuntu 16.04, GCC 6.4.0
หากค่าแรกของตัวแปร enum ไม่ได้ถูกเตรียมใช้งานคอมไพลเลอร์ C จะกำหนดค่า 0 โดยอัตโนมัติคอมไพลเลอร์ยังคงเพิ่มค่าของตัวแปร enum ที่นำหน้าด้วย 1
เช่น:
enum months{jan,feb,mar}
คำอธิบาย: ค่าของ jan จะเป็น 0, กุมภาพันธ์จะเป็น 1, มีนาคมจะเป็น 2
enum months{jan=123,feb=999,mar}
คำอธิบาย: ค่าของ jan จะเท่ากับ 123, กุมภาพันธ์จะเป็น 999, มีนาคมจะเป็น 1,000
enum months{jan='a',feb='s',mar}
คำอธิบาย: ค่าของ jan จะเป็น 'a', feb จะเป็น 's', mar จะเป็น 't'
't'
จะไม่รับประกันอาจมีชุดตัวอักษรที่ตัวอักษรที่ไม่ได้อยู่ในลำดับตัวอักษรต่อเนื่อง
ใช่ค่า enum bydefult เริ่มต้นจาก 0 ถึงองค์ประกอบที่ n ไปยังแพลตฟอร์มใด ๆ