Trong hướng dẫn này, chúng ta sẽ tìm hiểu về mức độ ưu tiên và tính liên kết của các toán tử trong C ++ với sự trợ giúp của các ví dụ.
Ưu tiên toán tử C ++
Nếu có nhiều toán tử trong một biểu thức, các phép toán không được đánh giá đồng thời. Thay vào đó, các toán tử có mức độ ưu tiên cao hơn sẽ đánh giá các hoạt động của họ trước.
Chúng ta hãy xem xét một ví dụ:
int x = 5 - 17 * 6;
Ở đây, toán tử nhân *
được ưu tiên cấp cao hơn toán tử trừ -
. Do đó, 17 * 6
được đánh giá đầu tiên.
Kết quả là, biểu thức trên tương đương với
int x = 5 - (17 * 6);
Nếu chúng ta muốn đánh giá 5 - 17
trước, thì chúng ta phải đặt chúng trong dấu ngoặc đơn :
int x = (5 - 17) * 6;
Ví dụ 1: Mức độ ưu tiên của nhà khai thác
#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; )
Đầu ra
num1 = -97 num2 = -97 num3 = -72
Lưu ý: Vì có rất nhiều toán tử trong C ++ với nhiều cấp độ ưu tiên, chúng tôi khuyên bạn nên sử dụng dấu ngoặc đơn để làm cho mã của chúng tôi dễ đọc hơn.
Bảng ưu tiên toán tử C ++
Bảng sau (lấy từ cppreference.com) cho thấy mức độ ưu tiên của các toán tử C ++. Mức ưu tiên 1 biểu thị các toán tử có mức độ ưu tiên cao nhất, trong khi Mức ưu tiên 17 biểu thị các toán tử có mức độ ưu tiên thấp nhất.
Tính chất của sự kết hợp sẽ được thảo luận ngay sau đây.
Quyền ưu tiên | Nhà điều hành | Sự miêu tả | Sự liên kết |
---|---|---|---|
1 | :: | Độ phân giải phạm vi | Trái sang phải |
2 | a ++ a-- type () type () a () a () . -> | Tăng hậu tố / hậu tố Giảm hậu tố / hậu tố Hàm ép kiểu Hàm ép hàm Cuộc gọi chỉ số Đăng ký Quyền truy cập thành viên từ một đối tượng Truy cập thành viên từ đối tượng ptr | Trái sang phải |
3 | ++ a --a + a -a ! ~ (type) * a & a sizeof co_await new new () delete delete () | Tăng tiền tố Giảm tiền tố Một bậc cộng với một bậc Trừ đi Logic KHÔNG theo chiều dọc KHÔNG theo chiều dọc KHÔNG phải kiểu ép kiểu C Hướng (dereference) Địa chỉ-của Kích thước-của biểu thức chờ đợi Cấp phát bộ nhớ động | Phải sang trái |
4 | . * -> * | Bộ chọn đối tượng thành viên Bộ chọn con trỏ thành viên | Trái sang phải |
5 | a * b a / b a% b | Mô-đun phân chia nhân | Trái sang phải |
6 | a + b a - b | Ngoài Trừ | Trái sang phải |
7 | << >> | Dịch chuyển sang trái theo chiều bit Dịch chuyển theo chiều dọc theo chiều sang phải | Trái sang phải |
số 8 | <= < | Toán tử so sánh ba chiều | Trái sang phải |
9 | < <= > > = | Nhỏ hơn Nhỏ hơn hoặc bằng Lớn hơn Lớn hơn hoặc bằng | Trái sang phải |
10 | == ! = | Bằng với Không bằng | Trái sang phải |
11 | & | Bitwise VÀ | Trái sang phải |
12 | ^ | Bitwise XOR | Trái sang phải |
13 | | | Bitwise HOẶC | Trái sang phải |
14 | && | Logic AND | Trái sang phải |
15 | || | Logic HOẶC | Trái sang phải |
16 | a? b: c ném co_yield = + = - = * = / = % = << = >> = & = = | = | Ternary có điều kiện khai thác ném biểu hiện năng suất (C ++ 20) Phân Addition Phân Trừ Phân Nhân Phân Division Phân Modulus Phân Bitwise phím Shift Left Phân Bitwise phím Shift chuyển quyền Bitwise AND Phân Bitwise XOR Phân Bitwise OR Chuyển nhượng | Phải sang trái |
17 | , | Toán tử dấu phẩy | Trái sang phải |
Hiệp hội toán tử C ++
Tính liên kết của toán tử là hướng mà từ đó một biểu thức được đánh giá. Ví dụ,
int a = 1; int b = 4; // a will be 4 a = b;
Hãy nhìn vào a = 4;
tuyên bố. Tính liên kết của =
toán tử là từ phải sang trái. Do đó, giá trị của b được gán cho a, và không theo hướng khác.
Ngoài ra, nhiều toán tử có thể có cùng mức độ ưu tiên (như chúng ta có thể thấy từ bảng trên). Khi nhiều toán tử có cùng mức độ ưu tiên được sử dụng trong một biểu thức, chúng được đánh giá theo tính kết hợp của chúng .
int a = 1; int b = 4; b += a -= 6;
Cả hai toán tử +=
và -=
toán tử đều có quyền ưu tiên như nhau. Vì sự kết hợp của các toán tử này là từ phải sang trái, đây là cách đánh giá câu lệnh cuối cùng.
a -= 6
được đánh giá đầu tiên. Do đó, a sẽ là -5- Sau đó,
b += -5
sẽ được đánh giá. Do đó, b sẽ là -1
Ví dụ 2: Sự liên kết của các nhà khai thác
#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; )
Đầu ra
a = -5 b = -1