Trong hướng dẫn này, bạn sẽ tìm hiểu về tính ưu tiên của toán tử và tính liên kết trong C #. Điều này sẽ cung cấp cho chúng ta ý tưởng về cách một biểu thức được trình biên dịch C # đánh giá.
Ưu tiên toán tử C #
Mức độ ưu tiên của toán tử là một tập hợp các quy tắc xác định cách một biểu thức được đánh giá. Trong C #, mỗi toán tử C # có một mức độ ưu tiên được chỉ định và dựa trên các mức độ ưu tiên này, biểu thức được đánh giá.
Ví dụ: ưu tiên của toán (*)
tử nhân cao hơn ưu tiên của (+)
toán tử cộng. Do đó, hoạt động liên quan đến phép nhân được thực hiện trước khi cộng.
Hãy xem tuyên bố dưới đây.
int x = 4 + 3 * 5;
Giá trị của x sẽ là bao nhiêu sau khi thực hiện câu lệnh này?
Toán hạng 3
được liên kết với +
và *
. Như đã nói trước đó, phép nhân có ưu tiên cao hơn phép cộng. Vì vậy, hoạt động 3 * 5
được thực hiện thay vì 4 + 3
. Giá trị của biến x sẽ là 19
.
Nếu phép cộng sẽ có mức độ ưu tiên cao hơn, 4 + 3
sẽ được đánh giá đầu tiên và giá trị của x sẽ là 35
.
Bảng ưu tiên nhà điều hành
Toán tử có mức độ ưu tiên càng cao thì nó càng xuất hiện trong bảng
Ưu tiên toán tử C #thể loại | Người điều hành |
---|---|
Tăng và giảm Postfix | ++, - |
Tiền tố tăng dần, giảm dần và một bậc | ++, -, +, -,!, ~ |
Phép nhân | *, /,% |
Phụ gia | +, - |
Shift | <> |
Quan hệ | <,,> = |
Bình đẳng | ==,! = |
Bitwise VÀ | & |
Bitwise XOR | ^ |
Bitwise HOẶC | | |
Logic AND | && |
Logic HOẶC | || |
Đệ tam | ? : |
Chuyển nhượng | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Các toán tử gán có mức ưu tiên thấp nhất trong khi toán tử tăng và giảm hậu tố có mức ưu tiên cao nhất.
Ví dụ 1: Mức độ ưu tiên của nhà khai thác
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); ) ) )
Khi chúng tôi chạy chương trình, kết quả đầu ra sẽ là:
19 Sai
Hãy hiểu cách biểu thức được đánh giá trong chương trình.
Mức độ ưu tiên của --
và ++
cao hơn *
, và mức độ ưu tiên của *
cao hơn -
. Do đó, tuyên bố,
result1 = --a * b - ++ c;
tương đương với
result1 = ((--a) * b) - (++ c);
Biểu thức bên trong dấu ngoặc luôn được đánh giá đầu tiên bất kể mức độ ưu tiên của các toán tử bên ngoài nó là bao nhiêu.
- Lúc đầu, (--a) được đánh giá dẫn đến
4
. - Sau đó (++ c) được đánh giá kết quả là
5
. - Bây giờ, (a * b) được đánh giá kết quả là
24
. - Cuối cùng, phép trừ được thực hiện dẫn đến
19
. - Do đó giá trị cuối cùng của result1 sẽ là
19
.
Trong biểu thức tiếp theo, mức độ ưu tiên của +
cao hơn >=
. Vì vậy, c và a được thêm vào trước và tổng được so sánh với b để tạo ra false
.
Tính liên kết của các toán tử trong C #
Trong phần trước, chúng ta đã thảo luận về ưu tiên toán tử. Nếu hai toán tử có mức độ ưu tiên khác nhau được sử dụng, thì toán tử có mức độ ưu tiên cao hơn được đánh giá trước.
Nhưng điều gì sẽ xảy ra nếu cả hai toán tử có cùng quyền ưu tiên?
Trong trường hợp này, biểu thức được đánh giá dựa trên tính liên kết của toán tử (từ trái sang phải hoặc từ phải sang trái).
Ví dụ:
int a = 5, b = 6, c = 3; int result = a * b / c;
Ở đây, cả hai *
và /
có cùng mức độ ưu tiên. Nhưng vì tính kết hợp của các toán tử này là từ trái sang phải , a * b
được đánh giá trước tiên và sau đó phép chia được thực hiện. Kết quả cuối cùng của biểu thức này sẽ là 10
.
Trong ví dụ cụ thể này, tính liên kết không thực sự quan trọng. Bởi vì ngay cả khi phép chia được thực hiện trước khi nhân, kết quả sẽ không bị ảnh hưởng.
Hãy xem một ví dụ khác.
int a = 5, b = 6, c = 3; a = b = c;
Tính liên kết của =
toán tử là từ phải sang trái . Vì vậy, giá trị của c (tức là 3
) được gán cho b, và sau đó giá trị của b được gán cho a. Vì vậy, sau khi thực hiện câu lệnh này, giá trị của a, b và c sẽ là 3
.
Bảng dưới đây cho thấy sự kết hợp của các toán tử C #:
C # Tính liên kết của các toán tửthể loại | Người điều hành | Sự liên kết |
---|---|---|
Tăng và giảm Postfix | ++, - | Trái sang phải |
Tiền tố tăng dần, giảm dần và một bậc | ++, -, +, -,!, ~ | Phải sang trái |
Phép nhân | *, /,% | Trái sang phải |
Phụ gia | +, - | Trái sang phải |
Shift | <> | Trái sang phải |
Quan hệ | <,,> = | Trái sang phải |
Bình đẳng | ==,! = | Trái sang phải |
Bitwise VÀ | & | Trái sang phải |
Bitwise XOR | ^ | Trái sang phải |
Bitwise HOẶC | | | Trái sang phải |
Logic AND | && | Trái sang phải |
Logic HOẶC | || | Trái sang phải |
Đệ tam | ? : | Phải sang trái |
Chuyển nhượng | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Phải sang trái |
Hầu hết tất cả các toán tử đều có liên kết từ trái sang phải. Các toán tử có liên kết từ phải sang trái là:
- Toán tử đơn nguyên
- Các toán tử tăng và giảm tiền tố
- Nhà khai thác bậc ba
- Người điều hành nhiệm vụ
Ví dụ 2: Tính liên kết của các toán tử
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); ) ) )
Khi chúng tôi chạy chương trình, kết quả đầu ra sẽ là:
10 a = 3, b = 3, c = 3