ค่า enum เริ่มต้นใน C เหมือนกันสำหรับคอมไพเลอร์ทั้งหมดหรือไม่


107

เมื่อประกาศ enum ตามที่แสดงด้านล่างคอมไพเลอร์ C ทั้งหมดตั้งค่าเริ่มต้นเป็นx=0หรือy=1ไม่และz=2ทั้งบนระบบ Linux และ Windows

typedef enum {
    x,
    y,
    z
} someName;

3
ใช่เป็นไปตามมาตรฐานและฉันมั่นใจว่าจะมีคนอ้างถึงได้
Nemo

คำตอบ:


115

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


14
และพฤติกรรมที่เหมือนกันนี้จำเป็นสำหรับทั้ง C และ C ++ ใน C ++ คือ[dcl.enum]: "ถ้าตัวแจงนับตัวแรกไม่มีตัวเริ่มต้นค่าของค่าคงที่ที่เกี่ยวข้องจะเป็นศูนย์คำนิยามตัวนับที่ไม่มีตัวเริ่มต้นจะทำให้ตัวแจงนับค่าที่ได้รับจากการเพิ่มค่าของตัวแจงนับก่อนหน้าทีละตัว"
Ben Voigt

3
ใช่และภาษาอื่น ๆ ที่ขึ้นต้นด้วยตัวอักษร C เช่น C #
James McNellis

70

มาตรฐาน 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


7

หากค่าแรกของตัวแปร 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'


1
Mar เป็นอยู่'t'จะไม่รับประกันอาจมีชุดตัวอักษรที่ตัวอักษรที่ไม่ได้อยู่ในลำดับตัวอักษรต่อเนื่อง
MM

-15

ใช่ค่า enum bydefult เริ่มต้นจาก 0 ถึงองค์ประกอบที่ n ไปยังแพลตฟอร์มใด ๆ


14
พิจารณาว่าคำตอบของคุณเพิ่มคำตอบอย่างไร นั่นคือคำตอบใหม่ของคุณ (5 ปีต่อมา) เพิ่มสิ่งใหม่ที่ไม่ครอบคลุมในคำตอบอื่นได้อย่างไร ในตอนแรกดูเหมือนว่าจะให้ข้อมูลน้อยกว่าอีกสองคำตอบ
LawfulEvil

2
อีเหี้ย @LawfulEvil ผ่อนคลาย. คำตอบหลายคำตอบทำให้ผู้คนมองสิ่งนี้ในมุมมองที่หลากหลายในอนาคต ที่กล่าวว่านี่เป็นคำตอบที่มีรูปแบบไม่ถูกต้องและไม่เป็นข้อมูล แต่คำตอบที่เพียงพอในตัวเองก็ไม่เลว
Kenny Worden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.