Chương 3: NỀN TẢNG NGÔN NGỮ C#
3.6.6 ưu tiên toán tử
Trình biên dịch phải xác định thứ tự thực hiện các toán tử trong trường hợp một biểu thức có nhiều phép toán, giả sử, có biểu thức sau:
var1 = 5+7*3;
Biểu thức trên có ba phép toán để thực hiện bao gồm (=, +,*). Ta thử xét các phép toán theo thứ tự từ trái sang phải, đầu tiên là gán giá trị 5 cho biến var1, sau đó cộng 7 vào 5 là 12 cuối cùng là nhân với 3, kết quả trả về là 36, điều này thật sự có vấn đề, không đúng với mục đích yêu cầu của chúng ta. Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết. Các luật về độ ưu tiên xử lý sẽ bảo trình biên dịch biết được toán tử nào được thực hiện trước trong biểu thức.Tương tự
như trong phép toán đại số thì phép nhân có độ ưu tiên thực hiện trước phép toán cộng, do vậy 5+7*3 cho kết quả là 26 đúng hơn kết quả 36. Và cả hai phép toán cộng và phép toán nhân điều có độ ưu tiên cao hơn phép gán. Như vậy trình biên dịch sẽ thực hiện các phép toán rồi sau đó thực hiện phép gán ở bước cuối cùng. Kết quả đúng của câu lệnh trên là biến var1 sẽ nhận giá trị là 26.
Trong ngôn ngữ C#, dấu ngoặc được sử dụng để thay đổi thứ tự xử lý, điều này cũng giống trong tính toán đại số. Khi đó muốn kết quả 36 cho biến var1 có thể viết:
var1 = (5+7) * 3;
Biểu thức trong ngoặc sẽ được xử lý trước và sau khi có kết quả là 12 thì phép nhân được thực hiện.
Bảng 3.6: Liệt kê thứ tự độ ưu tiên các phép toán trong C#.
STT Loại toán tử Toán tử Thứ tự
1 Phép toán cơ bản (x) x.y f(x) a[x] x++ x— new typeof Trái 2 + - ! ~ ++x –x (T)x Trái 3 Phép nhân * / % Trái 4 Phép cộng + - Trái 5 Dịch bit << >> Trái 6 Quan hệ < > <= >= is Trái 7 So sánh bằng == != Phải 8 Phép toán logic AND & Trái 9 Phép toán logic XOR ^ Trái
10 Phép toán logic OR | Trái
11 Điều kiện AND && Trái
12 Điều kiện OR || Trái
13 Điều kiện ?: Phải
14 Phép gán = *= /= %= += -= <<= >>=
Phải
Bảng 3.6: Thứ tự ưu tiên các toán tử.
Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ thự của bảng: thứ tự trái tức là độ ưu tiên của các phép toán từ bên trái sang, thứ tự phải thì các phép toán có độ ưu tiên từ bên phải qua trái. Các toán tử khác loại thì có độ ưu tiên từ trên xuống dưới, do vậy các toán tử loại cơ bản sẽ có độ ưu tiên cao nhất và phép
toán gán sẽ có độ ưu tiên thấp nhất trong các toán tử.