Tính ưu tiên và tính liên kết của toán tử C ++

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 - 17trướ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ử +=-=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 += -5sẽ đượ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

thú vị bài viết...