Thứ tự ưu tiên của các toán tử
Trong toán học, chúng ta biết rằng khi tính giá trị của một biểu thức, thì luôn có sự ưu tiên của các toán tử như: phép nhân thực hiện trước phép cộng, phép chia và nhân thực hiện đồng thời, ưu tiên từ trái sang phải… Trong lập trình C++ cũng vậy, các toán tử cũng có những độ ưu tiên nhất định. Trong một biểu thức phức tạp, bạn nên chú ý đến độ ưu tiên của các toán tử, điều này rất dễ gây ra sai sót. Trong bảng sau đây, tôi xin đưa ra thứ tự ưu tiên của các toán tử trong lập trình C++.Mức ưu tiên | Toán tử | Độ ưu tiên cùng loại |
1 | :: | Trái-sang-phải |
2 | () [] . -> ++ — (hậu tố) dynamic_cast static_cast reinterpret_cast const_cast typeid | Trái-sang-phải |
3 | ++ — (tiền tố) ~ ! sizeof new delete | Phải-sang-trái |
* & | ||
+ – (dấu dương âm) | ||
4 | (type) (chuyển đổi kiểu) | Phải-sang-trái |
5 | .* ->* | Trái-sang-phải |
6 | * / % | Trái-sang-phải |
7 | + – (phép toán công, trừ) | Trái-sang-phải |
8 | << >> | Trái-sang-phải |
9 | < > <= >= | Trái-sang-phải |
10 | == != | Trái-sang-phải |
11 | & | Trái-sang-phải |
12 | ^ | Trái-sang-phải |
13 | | | Trái-sang-phải |
14 | && | Trái-sang-phải |
15 | || | Trái-sang-phải |
16 | ?: | Phải-sang-trái |
17 | = *= /= %= += -= >>= <<= &= ^= |= | Phải-sang-trái |
18 | , | Trái-sang-phải |
Ví dụ:
- a = (b=0, c=0, b+c). Toán tử gán = có độ ưu tiên 17, các toán tử cộng + có độ ưu tiên 7, toán tử () có độ ưu tiên 2 và toán tử , có độ ưu tiên 18. Do đó, toán tử () sẽ được thực hiện trước. Bây giờ ta xét các toán tử trong dấu (), ta chú ý rằng các biểu thức b=0, c=0, b+c là các biểu thức riêng biệt, chúng được phân tách bởi toán tử ,. Theo thứ tự ưu tiên của toán tử phẩy, nó sẽ thực hiện từ trái-sang-phải. Nghĩa là b=0, c=0 sau đó là b+c. Cuối cùng nó sẽ thực hiện toán tử gán giá trị của biểu thức phức hợp bên phải cho bên trái. Kết quả là 0.
- a = (1+2)*3/2++. Toán tử gán (độ ưu tiên 17), toán tử + (độ ưu tiên 7), toán tử * (độ ưu tiên 6), toán tử / (độ ưu tiên 6), toán tử ++ hậu tố (độ ưu tiên 2) và toán tử () (độ ưu tiên 2). Như vậy toán tử hậu tố ++ và toán tử () sẽ thực hiện trước. Theo độ ưu tiên cùng loại, nó sẽ thực thi từ trái-sang-phải. Như vậy, toán tử () sẽ được thực hiện đầu tiên. Nghĩa là ta nhận được biểu thức a = 3*3/2++. Tiếp theo, nó thực hiện toán tử hậu tố ++, tuy nhiên toán tử này chỉ tăng giá trị của 2 lên 1 sau khi thực hiện xong các phép toán trong biểu thức. Đến thời điểm này, ta nhận được biểu thức a=3*3/2. Toán tử * và / có cùng độ ưu tiên, nó sẽ được thực hiện theo thứ trự từ trái sang phải, nghĩa là a=9/2=4. Kết quả 4.
a = (b=2, (1+2)*3/b++)
Bài tập 4. Tính toán các biểu thức sau, dựa vào độ ưu tiên của toán tử, sau đó, viết chương trình trên C++ để kiểm tra kết quả.
|
No comments:
Post a Comment