ה-enum ב-C ידוע גם בתור הסוג המנומר. זהו סוג נתונים המוגדר על ידי המשתמש המורכב מערכי מספרים שלמים, והוא מספק שמות משמעותיים לערכים אלו. השימוש ב-enum ב-C הופך את התוכנית לקלה להבנה ולתחזוקה. ה-enum מוגדר באמצעות מילת המפתח enum.
להלן הדרך להגדיר את ה-enum ב-C:
enum flag{integer_const1, integer_const2,.....integter_constN};
בהצהרה שלעיל, אנו מגדירים את ה-enum בשם כדגל המכיל קבועים שלמים 'N'. ערך ברירת המחדל של integer_const1 הוא 0, integer_const2 הוא 1 וכן הלאה. אנו יכולים גם לשנות את ערך ברירת המחדל של קבועי המספרים השלמים בזמן ההכרזה.
לדוגמה:
enum fruits{mango, apple, strawberry, papaya};
ערך ברירת המחדל של מנגו הוא 0, תפוח הוא 1, תות שדה הוא 2, ופפאיה הוא 3. אם ברצוננו לשנות את ערכי ברירת המחדל הללו, נוכל לעשות כמפורט להלן:
enum fruits{ mango=2, apple=1, strawberry=5, papaya=7, };
הצהרת סוג מסופר
כפי שאנו יודעים שבשפת C, אנו צריכים להכריז על המשתנה של סוג מוגדר מראש כגון int, float, char וכו'. בדומה, אנו יכולים להכריז על המשתנה של סוג נתונים מוגדר על ידי משתמש, כגון enum. בוא נראה כיצד נוכל להכריז על המשתנה של סוג enum.
נניח שאנו יוצרים את ה-enum של סטטוס הסוג כפי שמוצג להלן:
enum status{false,true};
כעת, אנו יוצרים את המשתנה מסוג סטטוס:
enum status s; // creating a variable of the status type.
בהצהרה לעיל, הכרזנו על המשתנה 's' של סטטוס הסוג.
כדי ליצור משתנה, ניתן לכתוב את שתי ההצהרות לעיל כך:
enum status{false,true} s;
במקרה זה, ערך ברירת המחדל של false יהיה שווה ל-0, והערך של true יהיה שווה ל-1.
בואו ניצור תוכנית פשוטה של enum.
#include enum weekdays{Sunday=1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; int main() { enum weekdays w; // variable declaration of weekdays type w=Monday; // assigning value of Monday to w. printf('The value of w is %d',w); return 0; }
בקוד לעיל, אנו יוצרים סוג enum בשם ימי חול, והוא מכיל את השם של כל שבעת הימים. הקצהנו ערך 1 ליום ראשון, וכל שאר השמות יקבלו ערך כערך הקודם פלוס אחד.
תְפוּקָה
בואו נדגים דוגמה נוספת כדי להבין את המניין בצורה ברורה יותר.
#include enum months{jan=1, feb, march, april, may, june, july, august, september, october, november, december}; int main() { // printing the values of months for(int i=jan;i<=december;i++) { printf('%d, ',i); } return 0; < pre> <p>In the above code, we have created a type of enum named as months which consists of all the names of months. We have assigned a '1' value, and all the other months will be given a value as the previous one plus one. Inside the main() method, we have defined a for loop in which we initialize the 'i' variable by jan, and this loop will iterate till December.</p> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-2.webp" alt="Enum in C"> <h3>Why do we use enum?</h3> <p>The enum is used when we want our variable to have only a set of values. For example, we create a direction variable. As we know that four directions exist (North, South, East, West), so this direction variable will have four possible values. But the variable can hold only one value at a time. If we try to provide some different value to this variable, then it will throw the compilation error.</p> <p>The enum is also used in a switch case statement in which we pass the enum variable in a switch parenthesis. It ensures that the value of the case block should be defined in an enum.</p> <p> <strong>Let's see how we can use an enum in a switch case statement.</strong> </p> <pre> #include enum days{sunday=1, monday, tuesday, wednesday, thursday, friday, saturday}; int main() { enum days d; d=monday; switch(d) { case sunday: printf('Today is sunday'); break; case monday: printf('Today is monday'); break; case tuesday: printf('Today is tuesday'); break; case wednesday: printf('Today is wednesday'); break; case thursday: printf('Today is thursday'); break; case friday: printf('Today is friday'); break; case saturday: printf('Today is saturday'); break; } return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-3.webp" alt="Enum in C"> <p> <strong>Some important points related to enum</strong> </p> <ul> <li>The enum names available in an enum type can have the same value. Let's look at the example.</li> </ul> <pre> #include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-4.webp" alt="Enum in C"> <ul> <li>If we do not provide any value to the enum names, then the compiler will automatically assign the default values to the enum names starting from 0.</li> <li>We can also provide the values to the enum name in any order, and the unassigned names will get the default value as the previous one plus one.</li> <li>The values assigned to the enum names must be integral constant, i.e., it should not be of other types such string, float, etc.</li> <li>All the enum names must be unique in their scope, i.e., if we define two enum having same scope, then these two enums should have different enum names otherwise compiler will throw an error.</li> </ul> <p> <strong>Let's understand this scenario through an example.</strong> </p> <pre> #include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-5.webp" alt="Enum in C"> <ul> <li>In enumeration, we can define an enumerated data type without the name also.</li> </ul> <pre> #include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-6.webp" alt="Enum in C"> <h3>Enum vs. Macro in C</h3> <ul> <li>Macro can also be used to define the name constants, but in case of an enum, all the name constants can be grouped together in a single statement. <br> For example, <br> # define pass 0; <br> # define success 1; <br> The above two statements can be written in a single statement by using the enum type. <br> enum status{pass, success};</li> <li>The enum type follows the scope rules while macro does not follow the scope rules.</li> <li>In Enum, if we do not assign the values to the enum names, then the compiler will automatically assign the default value to the enum names. But, in the case of macro, the values need to be explicitly assigned.</li> <li>The type of enum in C is an integer, but the type of macro can be of any type.</li> </ul> <hr></=december;i++)>
תְפוּקָה
כמה נקודות חשובות הקשורות ל-enum
- שמות ה-enum הזמינים בסוג enum יכולים להיות בעלי אותו ערך. בואו נסתכל על הדוגמה.
#include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; }
תְפוּקָה
- אם לא נספק שום ערך לשמות ה-enum, אזי המהדר יקצה אוטומטית את ערכי ברירת המחדל לשמות ה-enum החל מ-0.
- אנחנו יכולים גם לספק את הערכים לשם enum בכל סדר, והשמות שלא הוקצו יקבלו את ערך ברירת המחדל כמו הקודם פלוס אחד.
- הערכים המוקצים לשמות ה-enum חייבים להיות קבועים אינטגרליים, כלומר, הם לא צריכים להיות מסוגים אחרים כגון מחרוזת, ציפה וכו'.
- כל שמות ה-enum חייבים להיות ייחודיים בהיקפם, כלומר, אם נגדיר שני enum בעלי אותו היקף, אז שני ה-enums הללו צריכים להיות בעלי שמות enum שונים אחרת המהדר יזרוק שגיאה.
בואו נבין את התרחיש הזה באמצעות דוגמה.
#include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; }
תְפוּקָה
- בספירה, אנו יכולים להגדיר גם סוג נתונים מסופר ללא השם.
#include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; }
תְפוּקָה
Enum לעומת מאקרו ב-C
- ניתן להשתמש במאקרו גם כדי להגדיר את קבועי השמות, אך במקרה של enum, ניתן לקבץ את כל קבועי השמות יחדיו במשפט אחד.
לדוגמה,
# הגדר מעבר 0;
# הגדר הצלחה 1;
ניתן לכתוב את שני ההצהרות לעיל בהצהרה אחת על ידי שימוש בסוג ה-enum.
enum status{מעבר, הצלחה}; - סוג ה-enum עוקב אחר כללי ההיקף בעוד המאקרו אינו עוקב אחר כללי ההיקף.
- ב-Enum, אם לא נקצה את הערכים לשמות ה-enum, אז המהדר יקצה אוטומטית את ערך ברירת המחדל לשמות ה-enum. אבל, במקרה של מאקרו, יש להקצות את הערכים במפורש.
- סוג ה-enum ב-C הוא מספר שלם, אבל סוג המאקרו יכול להיות מכל סוג.
=december;i++)>