Σε αυτό το σεμινάριο θα μάθετε για την υπεροχή του χειριστή και τη συσχέτιση στο 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