Προτεραιότητα και συσχέτιση χειριστή C ++

Σε αυτό το σεμινάριο, θα μάθουμε για την προτεραιότητα και τη συσχέτιση των χειριστών στο C ++ με τη βοήθεια παραδειγμάτων.

Προτεραιότητα χειριστών C ++

Εάν υπάρχουν πολλοί τελεστές σε μία μόνο έκφραση, οι λειτουργίες δεν αξιολογούνται ταυτόχρονα. Αντίθετα, οι χειριστές με μεγαλύτερη προτεραιότητα αξιολογούν πρώτα τις λειτουργίες τους.

Ας εξετάσουμε ένα παράδειγμα:

 int x = 5 - 17 * 6; 

Εδώ, ο τελεστής πολλαπλασιασμού *έχει μεγαλύτερη προτεραιότητα από τον τελεστή αφαίρεσης -. Ως εκ τούτου, 17 * 6αξιολογείται πρώτα.

Ως αποτέλεσμα, η παραπάνω έκφραση είναι ισοδύναμη με

 int x = 5 - (17 * 6);

Αν θέλουμε να αξιολογήσουμε 5 - 17πρώτα, τότε πρέπει να τα περικλείσουμε σε παρένθεση :

 int x = (5 - 17) * 6;

Παράδειγμα 1: Προτεραιότητα χειριστών

 #include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )

Παραγωγή

 num1 = -97 num2 = -97 num3 = -72

Σημείωση: Επειδή υπάρχουν πολλοί τελεστές στο C ++ με πολλαπλά επίπεδα προτεραιότητας, συνιστάται ιδιαίτερα να χρησιμοποιούμε παρενθέσεις για να κάνουμε τον κώδικα πιο ευανάγνωστο.

Πίνακας προτεραιότητας χειριστών C ++

Ο παρακάτω πίνακας (που λαμβάνεται από το cppreference.com) δείχνει την προτεραιότητα των χειριστών C ++. Το επίπεδο προτεραιότητας 1 υποδεικνύει τους χειριστές της υψηλότερης προτεραιότητας, ενώ το επίπεδο προτεραιότητας 17 υποδεικνύει τους χειριστές της χαμηλότερης προτεραιότητας.

Η ιδιότητα του συνεταιρισμού θα συζητηθεί σύντομα.

Προβάδισμα Χειριστής Περιγραφή Συνεργασία
1 :: Ανάλυση πεδίου Από αριστερά προς τα δεξιά
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Πρόσθετο επίθημα / μετά επιδιόρθωση Επίπεδο
επιθέματος / επιδιόρθωση
Λειτουργία cast
Λειτουργία cast
Λειτουργία κλήσης
Συνδρομητής
Πρόσβαση μέλους από ένα αντικείμενο
Πρόσβαση μέλους από αντικείμενο ptr
Από αριστερά προς τα δεξιά
3 ++ α
--α
+ α

!
~
(type)
* a
& a
sizeof
co_await
new new ()
διαγραφή διαγραφή ()
Αύξηση
προθέματος
Αφαίρεση προθέματος Unary συν
Unary μείον
Λογικό NOT
bitwise NOT
C style cast
Έμμεση κατεύθυνση (dereference)
Διεύθυνση-
μέγεθος-
αναμονή-έκφραση
Δυναμική κατανομή
μνήμης Δυναμική αφαίρεση μνήμης
Δεξιά προς τα αριστερά
4 . *
-> *
Επιλογέας αντικειμένου
μέλους Επιλογέας δείκτη μέλους
Από αριστερά προς τα δεξιά
5 a * b
a / b
a% b
Συντελεστής
διαίρεσης πολλαπλασιασμού
Από αριστερά προς τα δεξιά
6 α + β
α - β

Αφαίρεση προσθήκης
Από αριστερά προς τα δεξιά
7 <<
>>
Αριστερή στροφή Bitwise Αριστερή στροφή
Bitwise
Από αριστερά προς τα δεξιά
8 <= < Τρισδιάστατος χειριστής σύγκρισης Από αριστερά προς τα δεξιά
9 <
<=
>
> =
Λιγότερο από
λιγότερο από ή ίσο με
μεγαλύτερο από
μεγαλύτερο ή ίσο με
Από αριστερά προς τα δεξιά
10 ==
! =
Ίση με
Όχι ίση με
Από αριστερά προς τα δεξιά
11 & Bitwise ΚΑΙ Από αριστερά προς τα δεξιά
12 ^ Bitwise XOR Από αριστερά προς τα δεξιά
13 | Bitwise Ή Από αριστερά προς τα δεξιά
14 && Λογική ΚΑΙ Από αριστερά προς τα δεξιά
15 || Λογική Ή Από αριστερά προς τα δεξιά
16 ένα ? b: c
ρίξτε
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternary Conditional
throw operator
απόδοση έκφραση (C ++ 20)
Ανάθεση
Προσθήκη Προσθήκη Ανάθεση
Αφαίρεση Ανάθεση
Πολλαπλασιασμός Αντιστοίχιση
Τμήμα Αντιστοίχιση
Συντελεστής ανάθεσης
Bitwise Shift Left Assignment
Bitwise Shift Right Assignment
Bitwise AND Assignment
Bitwise XOR Assignment
Bitwise OR Assignment
Δεξιά προς τα αριστερά
17 , Κόμμα χειριστή Από αριστερά προς τα δεξιά

Συνεργασία χειριστών C ++

Η συνάφεια χειριστή είναι η κατεύθυνση από την οποία αξιολογείται μια έκφραση. Για παράδειγμα,

 int a = 1; int b = 4; // a will be 4 a = b;

Ρίξτε μια ματιά στη a = 4;δήλωση. Η συνάφεια του =χειριστή είναι από δεξιά προς τα αριστερά. Ως εκ τούτου, η τιμή του b αντιστοιχεί σε ένα, και όχι προς την άλλη κατεύθυνση.

Επίσης, πολλοί χειριστές μπορούν να έχουν το ίδιο επίπεδο προτεραιότητας (όπως μπορούμε να δούμε από τον παραπάνω πίνακα). Όταν χρησιμοποιούνται πολλοί τελεστές του ίδιου επιπέδου προτεραιότητας σε μια έκφραση, αξιολογούνται σύμφωνα με τη συνάφεια τους .

 int a = 1; int b = 4; b += a -= 6;

Και οι δύο χειριστές +=και οι -=χειριστές έχουν την ίδια προτεραιότητα. Δεδομένου ότι η συσχέτιση αυτών των τελεστών είναι από δεξιά προς τα αριστερά, ακολουθεί ο τρόπος αξιολόγησης της τελευταίας δήλωσης.

  • a -= 6αξιολογείται πρώτα. Ως εκ τούτου, θα είναι -5
  • Στη συνέχεια, b += -5θα αξιολογηθεί. Ως εκ τούτου, το b θα είναι -1

Παράδειγμα 2: Συνεργασία χειριστών

 #include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )

Παραγωγή

 a = -5 b = -1

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