Σε αυτό το σεμινάριο θα μάθετε για την υπεροχή του χειριστή και τη συσχέτιση στο C #. Αυτό θα μας δώσει μια ιδέα για το πώς αξιολογείται μια έκφραση από τον μεταγλωττιστή C #.
C # Προτεραιότητα χειριστή
Η προτεραιότητα χειριστή είναι ένα σύνολο κανόνων που καθορίζει τον τρόπο αξιολόγησης μιας έκφρασης. Στο C #, κάθε χειριστής C # έχει μια καθορισμένη προτεραιότητα και με βάση αυτές τις προτεραιότητες, αξιολογείται η έκφραση.
Για παράδειγμα , η προτεραιότητα του (*)τελεστή πολλαπλασιασμού είναι υψηλότερη από την προτεραιότητα του (+)τελεστή προσθήκης . Επομένως, η λειτουργία που περιλαμβάνει πολλαπλασιασμό πραγματοποιείται πριν από την προσθήκη.
Ρίξτε μια ματιά στην παρακάτω δήλωση.
int x = 4 + 3 * 5;
Ποια θα είναι η τιμή του x μετά την εκτέλεση αυτής της δήλωσης;
Ο τελεστής 3σχετίζεται με +και *. Όπως αναφέρθηκε προηγουμένως, ο πολλαπλασιασμός έχει μεγαλύτερη προτεραιότητα από την προσθήκη. Έτσι, η λειτουργία 3 * 5πραγματοποιείται αντί 4 + 3. Η τιμή της μεταβλητής x θα είναι 19.
Εάν η προσθήκη έχει μεγαλύτερη προτεραιότητα, 4 + 3θα αξιολογηθεί πρώτα και η τιμή του x θα είναι 35.
Πίνακας προτεραιότητας χειριστή
Όσο υψηλότερη είναι η προτεραιότητα του χειριστή, τόσο υψηλότερη εμφανίζεται στον πίνακα
C # Προτεραιότητα χειριστή| Κατηγορία | Χειριστές |
|---|---|
| Αύξηση και μείωση μετά την επιδιόρθωση | ++, - |
| Αύξηση, μείωση και πρόθεμα προθέματος | ++, -, +, -,!, ~ |
| Πολλαπλασιαστικό | *, /,% |
| Πρόσθετος | +, - |
| Βάρδια | <> |
| Σχετικός | <,,> = |
| Ισότητα | ==,! = |
| Bitwise ΚΑΙ | & |
| Bitwise XOR | ^ |
| Bitwise Ή | | |
| Λογική ΚΑΙ | && |
| Λογική Ή | || |
| Τριαδικός | ; : |
| ΑΝΑΘΕΣΗ ΕΡΓΑΣΙΑΣ | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Οι τελεστές ανάθεσης έχουν τη χαμηλότερη προτεραιότητα, ενώ οι τελεστές αύξησης και μείωσης μετά την επίλυση έχουν την υψηλότερη προτεραιότητα.
Παράδειγμα 1: Προτεραιότητα χειριστή
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Όταν εκτελούμε το πρόγραμμα, η έξοδος θα είναι:
19 Λάθος
Ας καταλάβουμε πώς αξιολογείται η έκφραση στο πρόγραμμα.
Η προτεραιότητα --και ++είναι υψηλότερη από *, και η προτεραιότητα *είναι υψηλότερη από -. Εξ ου και η δήλωση,
αποτέλεσμα1 = --α * β - ++ γ;
είναι ισοδύναμο με
αποτέλεσμα1 = ((--α) * b) - (++ c);
Η έκφραση μέσα σε παρένθεση αξιολογείται πάντα πρώτα ανεξάρτητα από την προτεραιότητα των τελεστών εκτός αυτής.
- Αρχικά, το (--α) αξιολογείται ως αποτέλεσμα
4.
- Στη συνέχεια (++ c) αξιολογείται ως αποτέλεσμα
5.
- Τώρα, (a * b) αξιολογείται ως αποτέλεσμα
24.
- Τέλος, η αφαίρεση πραγματοποιείται με αποτέλεσμα
19.
- Εξ ου και η τελική τιμή του αποτελέσματος1 θα είναι
19.
Στην επόμενη έκφραση, η προτεραιότητα +είναι υψηλότερη από >=. Έτσι, προστίθενται πρώτα τα c και a και το άθροισμα συγκρίνεται με το b προς παραγωγή false.
Συνεργασία χειριστών σε C #
Στην προηγούμενη ενότητα, συζητήσαμε για την προτεραιότητα του χειριστή. Εάν χρησιμοποιούνται δύο τελεστές με διαφορετική προτεραιότητα, ο χειριστής με μεγαλύτερη προτεραιότητα αξιολογείται πρώτα.
Τι γίνεται όμως αν και οι δύο χειριστές έχουν την ίδια προτεραιότητα;
Σε αυτήν την περίπτωση, η έκφραση αξιολογείται με βάση τη συνάφεια του χειριστή (αριστερά προς δεξιά ή δεξιά προς αριστερά).
Για παράδειγμα:
int a = 5, b = 6, c = 3; int αποτέλεσμα = a * b / c;
Εδώ, *και τα δύο και /έχουν την ίδια προτεραιότητα. Όμως, δεδομένου ότι η συνάφεια αυτών των τελεστών είναι από αριστερά προς τα δεξιά , a * bαξιολογείται πρώτα και μετά πραγματοποιείται διαίρεση. Το τελικό αποτέλεσμα αυτής της έκφρασης θα είναι 10.
Σε αυτό το συγκεκριμένο παράδειγμα, η συνάφεια δεν έχει σημασία. Επειδή ακόμη και αν η διαίρεση πραγματοποιήθηκε πριν από τον πολλαπλασιασμό, το αποτέλεσμα δεν θα επηρεαστεί.
Ας ρίξουμε μια ματιά σε ένα άλλο παράδειγμα.
int a = 5, b = 6, c = 3; α = β = γ;
Η συνάφεια του =χειριστή είναι από δεξιά προς τα αριστερά . Έτσι, η τιμή του c (δηλ. 3) Αντιστοιχεί στο b και μετά η τιμή του b αντιστοιχεί στο a. Έτσι, μετά την εκτέλεση αυτής της δήλωσης, οι τιμές των a, b και c θα είναι 3.
Ο παρακάτω πίνακας δείχνει τη συνάφεια των χειριστών C #:
Γ # Συνδεσιμότητα των χειριστών| Κατηγορία | Χειριστές | Συνεργασία |
|---|---|---|
| Αύξηση και μείωση μετά την επιδιόρθωση | ++, - | Από αριστερά προς τα δεξιά |
| Αύξηση, μείωση και πρόθεμα προθέματος | ++, -, +, -,!, ~ | Δεξιά προς τα αριστερά |
| Πολλαπλασιαστικό | *, /,% | Από αριστερά προς τα δεξιά |
| Πρόσθετος | +, - | Από αριστερά προς τα δεξιά |
| Βάρδια | <> | Από αριστερά προς τα δεξιά |
| Σχετικός | <,,> = | Από αριστερά προς τα δεξιά |
| Ισότητα | ==,! = | Από αριστερά προς τα δεξιά |
| Bitwise ΚΑΙ | & | Από αριστερά προς τα δεξιά |
| Bitwise XOR | ^ | Από αριστερά προς τα δεξιά |
| Bitwise Ή | | | Από αριστερά προς τα δεξιά |
| Λογική ΚΑΙ | && | Από αριστερά προς τα δεξιά |
| Λογική Ή | || | Από αριστερά προς τα δεξιά |
| Τριαδικός | ; : | Δεξιά προς τα αριστερά |
| ΑΝΑΘΕΣΗ ΕΡΓΑΣΙΑΣ | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Δεξιά προς τα αριστερά |
Σχεδόν όλοι οι χειριστές έχουν συνάφεια από αριστερά προς τα δεξιά. Οι τελεστές που έχουν σχέση από δεξιά προς τα αριστερά είναι:
- Unary τελεστές
- Τελεστές αύξησης και μείωσης προθέματος
- Ternary χειριστής
- Χειριστές ανάθεσης
Παράδειγμα 2: Συνδεσιμότητα των χειριστών
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Όταν εκτελούμε το πρόγραμμα, η έξοδος θα είναι:
10 a = 3, b = 3, c = 3








