1. Giới thiệu
Bắt đầu bằng một ví dụ đời thường nhé. Hãy tưởng tượng một công thức nấu ăn:
Trộn bột, trứng và đường đánh lên thêm bơ đánh tiếp lần nữa.
Nghe hơi kỳ đúng không? Bây giờ thử tưởng tượng giữa từ "đánh lên" và "thêm bơ" có dấu phẩy hoặc dấu ngoặc. Thứ tự thao tác sẽ rõ ràng hơn hẳn.
Trong lập trình cũng vậy, khi bạn viết một biểu thức phức tạp:
bool result = a > 0 && b < 10 || c == 3;
Thứ tự nào nhỉ? Cái nào tính trước: a > 0 && b < 10, rồi mới || c == 3? Hay ngược lại? Nếu không có thứ tự tính toán rõ ràng, máy tính có thể "trộn lẫn nguyên liệu" và kết quả sẽ bất ngờ lắm đó.
2. Độ ưu tiên toán tử trong C#
C# (giống hầu hết các ngôn ngữ lập trình) dùng một bảng độ ưu tiên toán tử nhất định.
Toán tử có ưu tiên cao hơn sẽ được thực hiện trước toán tử ưu tiên thấp.
Xem phần quan trọng nhất của bảng này (cho biểu thức điều kiện):
| Toán tử | Mô tả | Độ ưu tiên |
|---|---|---|
| () | Dấu ngoặc | cao nhất |
| ! | Phủ định logic "KHÔNG" | cao |
| ==, != | Bằng / không bằng | trung bình |
| <, >, <=, >= | So sánh | trung bình |
| && | Logic "VÀ" | thấp hơn |
| || | Logic "HOẶC" | còn thấp hơn |
(Còn có toán tử số học — chúng ưu tiên cao hơn toán tử logic nhé.)
Quy tắc chính
Toán tử "VÀ" (&&) có ưu tiên cao hơn "HOẶC" (||),
tức là "VÀ" sẽ được tính trước, rồi mới tới "HOẶC".
Sơ đồ khối tính độ ưu tiên điều kiện
Thực tế: a > 0 && b < 10 || c == 3 — đầu tiên tính a > 0 && b < 10, rồi kết quả so với c == 3 qua ||.
3. Hướng của toán tử: từ trái sang phải hay ngược lại
Ngoài ưu tiên, còn có một khái niệm nữa: tính kết hợp (associativity).
Đây là quy tắc xác định hướng tính toán khi các toán tử cùng ưu tiên đứng cạnh nhau.
Ví dụ:
bool a = true, b = false, c = true;
bool result = a && b && c;
Câu hỏi: sẽ tính thế nào?
Trả lời: tính kết hợp của && là từ trái sang phải.
Nghĩa là, đầu tiên a && b, rồi kết quả đó với c.
Áp dụng cho điều kiện:
| Toán tử | Tính kết hợp |
|---|---|
| &&, || | từ trái sang phải |
| ! | từ phải sang trái |
4. Dấu ngoặc — bạn thân nhất khi gặp điều kiện phức tạp
Đây là lúc "phép màu" xuất hiện (và cứu nguy cho bạn). Khi viết biểu thức, dấu ngoặc thay đổi độ ưu tiên và làm code của bạn dễ hiểu, an toàn hơn nhiều.
Ví dụ 1 (không có ngoặc):
// Ta muốn: "Nếu người dùng là người lớn và là công dân, hoặc có thẻ đặc biệt"
bool isAdult = age >= 18;
bool isCitizen = country == "Belarus";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("Truy cập được phép!");
}
C# sẽ tính như sau:
Đầu tiên tính isAdult && isCitizen, sau đó kết quả đó so với || với hasPermit.
- Giả sử, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
Tức là, nếu ai có thẻ đặc biệt thì vẫn được vào.
Còn nếu không có thẻ, nhưng là người lớn và công dân — cũng được vào luôn.
Ví dụ 2 (có ngoặc):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("Truy cập được phép!");
}
Bây giờ chương trình sẽ kiểm tra trước:
isCitizen || hasPermit, rồi kết quả đó với isAdult.
Tức là bạn phải là người lớn và (hoặc là công dân, hoặc có thẻ đặc biệt).
Một thay đổi nhỏ ở dấu ngoặc — logic khác biệt hoàn toàn luôn!
GO TO FULL VERSION