Σύνταξη
enum <Όνομα τύπου Enum>> {Enumeration_Constant_Element-1,
Enumeration_Constant_Element-2,
Enumeration_Constant_Element-3,
…… .........,
Enumeration_Constant_Element-ν,
}?
Η προεπιλεγμένη τιμή του Enumeration_Constant_Element-1 είναι 0, η τιμή του Enumeration_Constant_Element-2 είναι 1, η τιμή του Enumeration_Constant_Element-3 είναι 2 και η τιμή του Enumeration_Constant_Element-n είναι (n-1).
Deep Dive into Enum
Τώρα, δεδομένου ότι γνωρίζουμε τη σύνταξη για τον ορισμό του τύπου απαρίθμησης, ας δούμε ένα παράδειγμα:
enumΛάθος{
IO_ERROR,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ
}?
Η λέξη -κλειδί enum πρέπει πάντα να χρησιμοποιείται για τον καθορισμό του τύπου απαρίθμησης. Έτσι, όποτε θέλετε να ορίσετε έναν τύπο απαρίθμησης, πρέπει να χρησιμοποιήσετε τη λέξη -κλειδί enum πριν. Μετά τη λέξη -κλειδί enum, πρέπει να χρησιμοποιήσετε ένα έγκυρο αναγνωριστικό για να ορίσετε το.
Στο παραπάνω παράδειγμα, ο μεταγλωττιστής θα εκχωρήσει IO_ERROR στην ολοκληρωμένη τιμή: 0, DISK_ERROR στην ολοκληρωμένη τιμή: 1 και NETWORK_ERROR στην ολοκληρωμένη τιμή: 2. Από προεπιλογή, στο πρώτο στοιχείο enum αποδίδεται πάντα η τιμή 0, στο επόμενο στο στοιχείο enum εκχωρείται η τιμή 1 και ούτω καθεξής.
Αυτή η προεπιλεγμένη συμπεριφορά μπορεί να αλλάξει εάν είναι απαραίτητο εκχωρώντας τη σταθερή ολοκληρωμένη τιμή ρητά, ως εξής:
enumΛάθος{IO_ERROR= 2,
DISK_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: Προεπιλεγμένη χρήση ορισμού αρίθμησης
- Παράδειγμα 2: Προσαρμοσμένη χρήση ορισμού enum
- Παράδειγμα 3: ορισμός enum χρησιμοποιώντας σταθερή έκφραση
- Παράδειγμα 4: πεδίο enum
Παράδειγμα 1: Προεπιλεγμένη χρήση ορισμού
Σε αυτό το παράδειγμα, θα μάθετε πώς να ορίσετε τον τύπο απαρίθμησης με προεπιλεγμένες σταθερές τιμές. Ο μεταγλωττιστής θα φροντίσει για την εκχώρηση των προεπιλεγμένων τιμών στα στοιχεία enum. Παρακάτω, θα δείτε το παράδειγμα προγράμματος και την αντίστοιχη έξοδο.
#περιλαμβάνω/ * Ορίστε τον τύπο enum */
enumΛάθος{
IO_ERROR,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ
}?
intκύριος()
{
enumΣφάλμα Hw_Error? /* Δημιουργία μεταβλητής enum*/
printf («Ρύθμιση σφάλματος Hw_Error σε IO_ERROR n')?
Hw_Error=IO_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε DISK_ERROR n')?
Hw_Error=DISK_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε NETWORK_ERROR n')?
Hw_Error=ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
ΕΠΙΣΤΡΟΦΗ 0?
}
Παράδειγμα 2: Χρήση προσαρμοσμένου ορισμού
Σε αυτό το παράδειγμα, θα μάθετε πώς να ορίσετε τον τύπο απαρίθμησης με μια προσαρμοσμένη σταθερή τιμή. Επίσης, αυτό το παράδειγμα θα σας βοηθήσει να καταλάβετε πώς μπορεί να γίνει η προετοιμασία των προσαρμοσμένων σταθερών με οποιαδήποτε τυχαία σειρά. Σε αυτό το παράδειγμα, ορίσαμε ρητά τη σταθερή τιμή για το 1stκαι 3rdenum στοιχεία (δηλαδή, IO_ERROR και NETWORK_ERROR, αντίστοιχα), αλλά έχουμε παραλείψει τη ρητή αρχικοποίηση για το 2ndκαι 4ουστοιχεία. Είναι πλέον ευθύνη του μεταγλωττιστή να εκχωρήσει τις προεπιλεγμένες τιμές στο 2ndκαι 4ουenum στοιχεία (δηλαδή, DISK_ERROR και PRINT_ERROR, αντίστοιχα). Το DISK_ERROR θα αντιστοιχιστεί σε μια τιμή 3 και το PRINT_ERROR θα αποδοθεί σε μια τιμή 9. Παρακάτω, θα δείτε το παράδειγμα προγράμματος και την έξοδο.
#περιλαμβάνω/* Ορισμός του τύπου enum - Προσαρμοσμένη αρχικοποίηση*/
enumΛάθος{
IO_ERROR= 2,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ= 8,
PRINT_ERROR
}?
intκύριος()
{
/* Δήλωση μεταβλητής αρίθμησης*/
enumΣφάλμα Hw_Error?
printf («Ρύθμιση σφάλματος Hw_Error σε IO_ERROR n')?
Hw_Error=IO_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε DISK_ERROR n')?
Hw_Error=DISK_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε NETWORK_ERROR n')?
Hw_Error=ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΟρισμός σφάλματος Hw_Error σε PRINT_ERROR n')?
Hw_Error=PRINT_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
ΕΠΙΣΤΡΟΦΗ 0?
}
Παράδειγμα 3: Ορισμός αριθμού χρησιμοποιώντας σταθερή έκφραση
Σε αυτό το παράδειγμα, θα μάθετε πώς να χρησιμοποιείτε τη σταθερή έκφραση για να καθορίσετε τη σταθερή τιμή για στοιχεία enum.
#περιλαμβάνω/* Ορίστε τον τύπο enum - προσαρμοσμένη αρχικοποίηση χρησιμοποιώντας σταθερή έκφραση
η σταθερή έκφραση χρησιμοποιείται εδώ σε περίπτωση:
ένα. IO_ERROR και
σι. ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ
Αυτός είναι ένας ασυνήθιστος τρόπος καθορισμού των στοιχείων enum. ωστόσο, αυτό
πρόγραμμα αποδεικνύει ότι αυτός ο τρόπος αρχικοποίησης στοιχείων enum είναι δυνατός στο γ.
* /
enumΛάθος{
IO_ERROR= 1 + 2 * 3 + 4,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ= 2 == 2,
PRINT_ERROR
}?
intκύριος()
{
/* Δήλωση μεταβλητής αρίθμησης*/
enumΣφάλμα Hw_Error?
printf («Ρύθμιση σφάλματος Hw_Error σε IO_ERROR n')?
Hw_Error=IO_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε DISK_ERROR n')?
Hw_Error=DISK_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε NETWORK_ERROR n')?
Hw_Error=ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΟρισμός σφάλματος Hw_Error σε PRINT_ERROR n')?
Hw_Error=PRINT_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
ΕΠΙΣΤΡΟΦΗ 0?
}
Παράδειγμα 4: enum Πεδίο εφαρμογής
Σε αυτό το παράδειγμα, θα μάθετε πώς λειτουργεί ο κανόνας πεδίου εφαρμογής για το enum. Ένα MACRO (#define) θα μπορούσε να χρησιμοποιηθεί για να ορίσει μια σταθερά αντί για το enum, αλλά ο κανόνας του πεδίου εφαρμογής δεν λειτουργεί για το MACRO.
#περιλαμβάνωintκύριος()
{
/ * Ορίστε τον τύπο enum */
enumΣφάλμα_1{
IO_ERROR= 10,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ= 3,
PRINT_ERROR
}?
{
/* Ορίστε τον τύπο enum στο εσωτερικό πεδίο*/
enumΣφάλμα_1{
IO_ERROR= είκοσι,
DISK_ERROR,
ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ= 35,
PRINT_ERROR
}?
/* Δήλωση μεταβλητής αρίθμησης*/
enumΣφάλμα_1 Hw_Error?
printf («Ρύθμιση σφάλματος Hw_Error σε IO_ERROR n')?
Hw_Error=IO_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε DISK_ERROR n')?
Hw_Error=DISK_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΡύθμιση Hw_Error σε NETWORK_ERROR n')?
Hw_Error=ΣΦΑΛΜΑ ΔΙΚΤΥΟΥ?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
printf (' nΟρισμός σφάλματος Hw_Error σε PRINT_ERROR n')?
Hw_Error=PRINT_ERROR?
printf ('Αξία Hw_Error = %d n',Hw_Error)?
}
ΕΠΙΣΤΡΟΦΗ 0?
}
Σύγκριση μεταξύ enum και macro
Enum | Μακροεντολή |
Ο κανόνας του πεδίου εφαρμογής ισχύει για το enum. | Ο κανόνας περιορισμού δεν ισχύει για τη μακροεντολή. |
Προεπιλεγμένη αντιστοίχιση τιμής πραγματοποιείται αυτόματα. Το Enum είναι πολύ χρήσιμο για τον καθορισμό ενός μεγάλου αριθμού σταθερών. Ο μεταγλωττιστής λαμβάνει την προεπιλεγμένη αρχική σταθεροποίηση τιμής. | Οι σταθερές τιμές μακροεντολής πρέπει πάντα να αναφέρονται ρητά από τον προγραμματιστή. Αυτό θα μπορούσε να είναι μια κουραστική διαδικασία για μεγάλο αριθμό σταθερών αφού ο προγραμματιστής πρέπει πάντα να ορίζει χειροκίνητα κάθε σταθερή τιμή ενώ ορίζει τη μακροεντολή. |
συμπέρασμα
Το πρόγραμμα enum σε C θα μπορούσε να θεωρηθεί προαιρετική μέθοδος για μεμονωμένα προγράμματα ή έργα μικρού μεγέθους, καθώς οι προγραμματιστές μπορούν πάντα να χρησιμοποιούν μακροεντολή αντί για enum. Ωστόσο, έμπειροι προγραμματιστές τείνουν να χρησιμοποιούν το enum over macro για έργα ανάπτυξης λογισμικού μεγάλης κλίμακας. Αυτό βοηθά στη σύνταξη καθαρών και ευανάγνωστων προγραμμάτων.