C # Προτεραιότητα και συσχέτιση των χειριστών: Ορισμός και παραδείγματα

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

ενδιαφέροντα άρθρα...