Toán tử Tăng và giảm
Các toán tử tăng và giảm cho phép viết phép tăng hoặc giảm của toán hạng theo 1 theo cách đơn giản. Chúng thường xuất hiện bên trong các vòng lặp để sửa đổi các chỉ mục khi truy cập vào các mảng hoặc các đối tượng khác hỗ trợ phép liệt kê.
Toán tử tăng được biểu thị bằng hai dấu cộng liên tiếp: ++
. Toán tử giảm được biểu thị bằng hai dấu trừ liên tiếp: --
.
Có hai loại toán tử như vậy: Prefix and postfix - Tiền tố và hậu tố.
Các toán tử tiền tố, đúng như tên gọi của nó, được viết trước toán hạng (++x
, --x
). Chúng thay đổi giá trị toán hạng và giá trị mới này sẽ tham gia vào các phép tính tiếp theo của biểu thức.
Các toán tử hậu tố được viết sau toán hạng (x++
, x--
). Chúng thay thế bản sao của giá trị toán hạng hiện tại trong biểu thức và sau đó thay đổi giá trị của nó (giá trị mới không được đưa vào biểu thức). Các ví dụ đơn giản được đưa ra trong tập lệnh ExprIncDec.mq5
.
int i = 0, j;
j = ++i; // j = 1, i = 1
j = i++; // j = 1, i = 2
2
3
Dạng hậu tố có thể hữu ích cho việc viết biểu thức cô đọng hơn bằng cách kết hợp tham chiếu đến giá trị trước đó của toán hạng và sửa đổi bên của nó (cần có hai câu lệnh riêng biệt để tạo bản ghi thay thế cho cùng một giá trị). Trong mọi trường hợp khác, nên sử dụng dạng tiền tố (nó không tạo bản sao tạm thời của giá trị "cũ").
Trong ví dụ sau, dấu được đảo ngược trong các phần tử mảng liên tiếp, cho đến khi tìm thấy phần tử thứ không. Việc di chuyển qua các chỉ số mảng được đảm bảo bằng cách tăng hậu tố k++
bên trong vòng lặp while
. Do hậu tố, biểu thức a[k++] = -a[k]
đầu tiên cập nhật phần tử thứ k và sau đó tăng k thêm 1. Sau đó, kết quả gán được kiểm tra xem có bằng không (!= 0, xem phần sau).
int k = 0;
int a[] = {1, 2, 3, 0, 5};
while((a[k++] = -a[k]) != 0){}
// a[] = {-1, -2, -3, 0, 5};
2
3
4
Bảng dưới đây hiển thị các toán tử tăng và giảm theo thứ tự ưu tiên:
P | Biểu tượng | Sự miêu tả | Ví dụ | A |
---|---|---|---|---|
1 | ++ | Tăng hậu tố | e++ | L |
1 | -- | Giảm hậu tố | e-- | L |
2 | ++ | Tăng tiền tố | ++e | R |
2 | -- | Giảm tiền tố | --e | R |
Tất cả các phép toán tăng và giảm đều có mức độ ưu tiên cao hơn các phép toán số học. Tiền tố có mức độ ưu tiên thấp hơn hậu tố. Trong ví dụ sau, giá trị "cũ" của x
được cộng với giá trị của y
, sau đó x
được cộng. Nếu mức độ ưu tiên của tiền tố cao hơn, thì phép cộng của y
sẽ được thực hiện, sau đó giá trị mới, 6
, sẽ được cộng với x
, và chúng ta sẽ có z = 6
, x = 0
(trước đó).
int x = 0 , y = 5 ; int z = x +++ y ; // "x++ + y" : z = 5, x = 1