g) Toán tử dãy
2.3.3. Thứ tự ưu tiên các phép toán
toán
Các phép toán có độ ưu tiên khác nhau, điều này có ý nghĩa trong cùng một biểu thức sẽ có một số phép toán này được thực hiện trước một số phép toán khác.
Thứ tự ưu tiên của các phép toán được trình bày trong bảng sau:
Thứ tự Phép toán Trình tự kết hợp
1 :: Trái qua phải
2 () [] . -> ++ -- dynamic_cast static_cast reinterpret_cast const_cast typeid
Trái qua phải
3 ++ -- ~ ! sizeof new delete Phải qua trái * &
+ -
4 (type) Phải qua trái
5 .* ->* Trái qua phải
6 * / % Trái qua phải
7 + - Trái qua phải
8 << >> Trái qua phải
9 < > <= >= Trái qua phải
10 == != Trái qua phải
11 & Trái qua phải
12 ^ Trái qua phải
13 | Trái qua phải
14 && Trái qua phải
15 || Trái qua phải
16 ?: Phải qua trái
17 = *= /= %= += -= >>= <<= &= ^= |= Phải qua trái
Nếu có nhiều cặp ngoặc lồng nhau thì cặp trong cùng (sâu nhất) được tính trước. Các phép toán trong cùng một lớp có độ ưu tiên theo thứ tự: lớp nhân (*, /, &&), lớp cộng (+, ~, ||). Nếu các phép toán có cùng thứ tự ưu tiên thì chương trình sẽ thực hiện từ trái sang phải. Các phép gán có độ ưu tiên cuối cùng và được thực hiện từ phải sang trái. Ví dụ theo mức ưu tiên đã qui định, biểu thức tính x trong ví dụ trên sẽ được tính như x = 3 + (4 * 2) + 7 = 18. Phần lớn các trường hợp muốn tính toán theo một trật tự nào đó ta nên sử dụng cụ thể các dấu ngoặc (vì các biểu thức trong dấu ngoặc được tính trước).
2.3.4. Câu lệnh
Một câu lệnh trong C++ được thiết lập từ các từ khoá và các biểu thức … và luôn luôn được kết thúc bằng dấu chấm phẩy. Các ví dụ vào/ra hoặc các phép gán tạo thành những câu lệnh đơn giản như:
cin >> x >> y;
x = 3 + x; y = (x = sqrt(x)) + 1; cout<<x; cout<<y;
Lệnh hợp thành hay lệnh ghép (Compound statement)
Một dãy các câu lệnh được bao bởi các dấu { } gọi là một khối lệnh. Ví dụ:
{
a=2; b=3;
printf("\n%6d%6d",a,b); }
C++ xem khối lệnh cũng như một câu lệnh riêng lẻ. Nói cách khác, chỗ nào viết được một câu lệnh thì ở đó cũng có quyền đặt một khối lệnh.
Sự lồng nhau của các khối lệnh và phạm vi hoạt động của các biến:
Bên trong một khối lệnh lại có thể viết lồng khối lệnh khác. Sự lồng nhau theo cách như vậy là không hạn chế.
Khi máy bắt đầu làm việc với một khối lệnh thì các biến và mảng khai báo bên trong nó mới được hình thành và được cấp phát bộ nhớ. Các biến này chỉ tồn tại trong thời gian máy làm việc bên trong khối lệnh và chúng lập tức biến mất ngay sau khi máy ra khỏi khối lệnh.
Vậy giá trị của một biến hay một mảng khai báo bên trong một khối lệnh không thể đưa ra sử dụng ở bất kỳ chỗ nào bên ngoài khối lệnh đó.
Ở bất kỳ chỗ nào bên ngoài một khối lệnh ta không thể can thiệp đến các biến và các mảng được khai báo bên trong khối lệnh
Nếu bên trong một khối ta dùng một biến hay một mảng có tên là a thì điều này không làm thay đổi giá trị của một biến khác cũng có tên là a (nếu có) được dùng ở đâu đó bên ngoài khối lệnh này.
Nếu có một biến đã được khai báo ở ngoài một khối lệnh và không trùng tên với các biến khai báo bên trong khối lệnh này thì biến đó cũng có thể sử dụng cả bên trong cũng như bên ngoài khối lệnh.
Ví dụ 2.
Xét đoạn chương trình sau:
{
int a=5,b=2; {
int a=4; b=a+b;
cout<<a << endl << b << endl; }
cout<<a << endl << b << endl; }
Khi đó đoạn chương trình sẽ in kết quả như sau:
a trong =4 b=6 a ngoài =5 b=6