Vòng lặp While
Vòng lặp này được mô tả bằng từ khóa while
. Nó lặp lại việc thực thi các câu lệnh được kiểm soát miễn là biểu thức logic trong tiêu đề của nó là đúng.
while (condition)
loop body
2
Điều kiện là một biểu thức tùy ý thuộc kiểu boolean. Sự hiện diện của điều kiện là bắt buộc. Nếu điều kiện là false
trước khi vòng lặp bắt đầu, vòng lặp sẽ không bao giờ thực thi.
Không giống như C++, MQL5 không hỗ trợ định nghĩa biến trong tiêu đề của vòng lặp
while
.
Các biến được sử dụng trong điều kiện phải được định nghĩa trước vòng lặp.
Thân vòng lặp là một câu lệnh đơn giản hoặc phức hợp.
Vòng lặp while
thường được sử dụng khi số lần lặp không được xác định. Vì vậy, một ví dụ về vòng lặp xuất ra bộ đếm thời gian của máy tính mỗi giây có thể được viết bằng vòng lặp while
và kiểm tra cờ dừng (bằng cách gọi hàm IsStopped
) như sau (StmtLoopsWhile.mq5
):
while(!IsStopped())
{
Comment(GetTickCount());
Sleep(1000);
}
Comment("");
2
3
4
5
6
Ngoài ra, vòng lặp while
rất tiện lợi khi điều kiện kết thúc vòng lặp có thể được kết hợp với việc sửa đổi biến trong cùng một biểu thức. Vòng lặp tiếp theo được thực thi cho đến khi biến i
đạt giá trị 0 (0 được coi là false
).
int i = 5;
while(--i) // cảnh báo: biểu thức không phải boolean
{
Print(i);
}
2
3
4
5
Tuy nhiên, trong trường hợp này, biểu thức tiêu đề không phải là boolean (và được chuyển đổi ngầm thành false
hoặc true
). Trình biên dịch tạo ra cảnh báo tương ứng. Nên luôn soạn các biểu thức theo các đặc điểm dự kiến (theo quy tắc). Dưới đây là phiên bản đúng của vòng lặp:
int i = 5;
while(--i > 0)
{
Print(i);
}
2
3
4
5
Vòng lặp cũng có thể được sử dụng với một câu lệnh đơn giản (không có khối):
while(i < 10)
Print(++i);
2
Lưu ý rằng một câu lệnh đơn giản kết thúc bằng dấu chấm phẩy. Nó cũng cho thấy rằng việc thay đổi biến được kiểm tra trong tiêu đề được thực hiện bên trong vòng lặp.
Khi làm việc với các vòng lặp, hãy cẩn thận khi sử dụng số nguyên không dấu. Ví dụ, vòng lặp tiếp theo sẽ không bao giờ kết thúc, vì điều kiện của nó luôn đúng (về lý thuyết, trình biên dịch có thể đưa ra cảnh báo ở những chỗ như vậy, nhưng nó không làm thế). Sau khi đạt 0, bộ đếm sẽ "quay vòng" thành một số dương lớn (UINT_MAX) và vòng lặp sẽ tiếp tục.
uint i = 5;
while(--i >= 0)
{
Print(i);
}
2
3
4
5
Từ góc độ của người dùng, chương trình MQL sẽ bị treo (ngừng phản hồi các lệnh), mặc dù nó vẫn sẽ tiêu tốn tài nguyên (bộ xử lý và bộ nhớ).
Vòng lặp while
có thể được lồng nhau giống như các loại câu lệnh lặp khác.