Mức độ ưu tiên và tính liên kết của Toán tử Swift (Với các ví dụ)

Trong bài này, bạn sẽ tìm hiểu về các quy tắc được sử dụng để đánh giá một biểu thức với các toán tử và toán hạng.

Ưu tiên toán tử Swift

Ưu tiên toán tử là tập hợp các quy tắc được sử dụng để đánh giá một biểu thức toán học nhất định. Khi có một số toán tử được sử dụng trong một biểu thức duy nhất, mỗi phần được đánh giá theo một thứ tự nhất định được gọi là ưu tiên toán tử. Một số toán tử nhất định có mức ưu tiên cao hơn những toán tử khác, điều này ảnh hưởng đến cách một biểu thức được đánh giá.

Bảng ưu tiên toán tử

Bảng dưới đây liệt kê thứ tự ưu tiên của các toán tử trong Swift. Nó xuất hiện trong bảng càng cao thì mức độ ưu tiên của nó càng cao.

Nhóm ưu tiên thư viện chuẩn Swift (Từ cao nhất đến thấp nhất)
Nhóm điều hành Ví dụ
Ưu tiên dịch chuyển bit >> & <>>>
Ưu tiên nhân & *% & * /
Ưu tiên bổ sung | & + & - + - ^
Mức độ hình thành phạm vi … <…
Ưu tiên đúc giống như
Ưu tiên Nil-Coalescing ??
Ưu tiên so sánh ! => = <= === ==
Ưu tiên liên kết logic &&
Thứ tự phân biệt logic ||
Quyền ưu tiên mặc định ~>
Ưu tiên bậc ba ?:
Mức độ ưu tiên của hàm Mũi tên ()
Ưu tiên chuyển nhượng | =% = / = & <> = & = * = >> = << = = + = - =

Ví dụ 1: Quyền ưu tiên của toán tử Swift

 let x = 4 + 5 * 5 print(x) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 29

Trong ví dụ trên, nếu bạn đọc biểu thức từ trái sang phải, bạn có thể mong đợi kết quả đầu ra là 45. Nhưng, toán tử nhân có mức ưu tiên cao hơn toán tử cộng nên biểu thức 4 + 5 * 5 được đánh giá là 4 + (5 * 5). Do đó print(x)xuất ra 29 trên màn hình.

Các bước thực hiện
Các bước Nhà điều hành Biểu hiện Giá trị trả về từ biểu thức
1 * 5 * 5 25
2 + 4 + 25 29
3 = print (x) 29

Ví dụ 2: Ưu tiên toán tử Swift với toán tử gán phức tạp

 var y = 15 y += 10 - 2 * 3 print(y) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 19

Trong ví dụ trên, biểu thức var y = 15gán giá trị 15 trong biến y.

Trong biểu thức tiếp theo y += 10 - 2 * 3, toán tử nhân có mức độ ưu tiên cao hơn toán tử phép trừ và phép gán ghép ( +=).

Do đó, biểu thức y += 10 - 2 * 3được đánh giá là y = y + (10 - (2 * 3)).

Các bước thực hiện
Các bước Nhà điều hành Biểu hiện Giá trị trả về từ biểu thức
1 = var y = 15 15
2 * 2 * 3 6
3 - 10 - 6 4
4 + = 15 + 4 19

Swift Operator Associativity

Mặc dù có các quy tắc xác định trước được xác định theo mức ưu tiên của toán tử để đánh giá một biểu thức, bạn có thể tự hỏi điều gì sẽ xảy ra nếu có nhiều toán tử có cùng mức ưu tiên. Phép toán kết hợp xác định cách nhóm các toán tử có cùng mức độ ưu tiên với nhau.

Trong Swift, các toán tử có thể là liên kết trái, liên kết phải hoặc không có liên kết. Các toán tử có liên kết trái, nhóm các toán hạng của chúng từ bên trái của câu lệnh, các toán tử kết hợp phải từ bên phải và các toán tử không có liên kết không có hành vi xác định khi được sử dụng theo trình tự trong một biểu thức.

Bảng kết hợp toán tử

Bảng dưới đây cho thấy sự liên kết của các toán tử Swift cùng với mức độ ưu tiên.

Liên tưởng thư viện tiêu chuẩn Swift (Mức độ ưu tiên từ cao nhất đến thấp nhất)
Nhóm điều hành Ví dụ Sự liên kết
Ưu tiên dịch chuyển bit >> & <>>> không ai
Ưu tiên nhân & *% & * / trái
Ưu tiên bổ sung | & + & - + - ^ trái
Mức độ hình thành phạm vi … <… không ai
Ưu tiên đúc giống như không ai
Ưu tiên Nil-Coalescing ?? đúng
Ưu tiên so sánh ! => = <= === == không ai
Ưu tiên liên kết logic && trái
Thứ tự phân biệt logic || trái
Quyền ưu tiên mặc định ~> không ai
Ưu tiên bậc ba ?: đúng
Mức độ ưu tiên của hàm Mũi tên () đúng
Ưu tiên chuyển nhượng | =% = / = & <> = & = * = >> = << = = đúng

Ví dụ 3: Tính liên tưởng toán tử Swift

 let x = 40 / 2 * 10 print(x) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 200

Trong chương trình trên, biểu thức được đánh giá từ trái sang phải vì các toán tử được xếp vào nhóm ưu tiên nhân và có tính kết hợp trái. Do đó, hoạt động chia diễn ra sớm hơn và bạn nhận được kết quả 200 . Nếu bạn muốn thực hiện phép nhân trước thì sao? Bạn cần đặt 2 * 10biểu thức vào dấu ngoặc nhọn () như sau:

 let x = 40 / (2 * 10) print(x) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 2

Bạn không cần phải ghi nhớ mức độ ưu tiên và bảng kết hợp. Hầu hết thời gian, mức độ ưu tiên và tính liên kết của các toán tử tự nó có ý nghĩa. Bạn luôn có thể sử dụng bảng để tham khảo khi nghi ngờ. Ngoài ra, tốt hơn nên sử dụng dấu ngoặc đơn để làm cho mã của bạn dễ hiểu hơn.

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