Câu lệnh đơn giản (biểu thức)
Câu lệnh đơn giản chứa các biểu thức, chẳng hạn như gán giá trị mới hoặc kết quả tính toán cho các biến, cũng như các lời gọi hàm.
Về mặt hình thức, cú pháp trông như sau:
expression;
Dấu chấm phẩy ở cuối rất quan trọng ở đây. Vì mã nguồn MQL5 hỗ trợ định dạng tự do, dấu ;
là dấu phân cách duy nhất cho trình biên dịch biết nơi câu lệnh trước đó kết thúc và câu lệnh tiếp theo bắt đầu. Theo quy tắc, các câu lệnh được viết trên các dòng riêng biệt, ví dụ như sau:
int i = 0, j = 1, k; // câu lệnh khai báo
++i; // câu lệnh đơn giản
j += i; // câu lệnh đơn giản
k = (i + 1) * (j + 1); // câu lệnh đơn giản
Print(i, " ", j); // câu lệnh đơn giản
2
3
4
5
Tuy nhiên, các quy tắc không cấm viết mã theo kiểu ngắn gọn:
int i=0,j=1;++i;j+=i;k=(i+1)*(j+1);Print(i," ",j);
Nếu không có dấu ;
, các biểu thức liền kề có thể âm thầm "dính" vào nhau và dẫn đến kết quả không mong muốn. Ví dụ, biểu thức x = y - 10 * z
hoàn toàn có thể là hai biểu thức: x = y;
và -10 * z;
(-10 với dấu trừ đơn). Điều này có thể xảy ra như thế nào?
Sự thật là về mặt cú pháp, được phép viết một câu lệnh mà thực tế không làm gì, tức là không lưu kết quả. Đây là một ví dụ khác:
i + j; // warning: expression has no effect
Trình biên dịch đưa ra cảnh báo expression has no effect
(biểu thức không có hiệu quả). Khả năng xây dựng các biểu thức như vậy là cần thiết vì các kiểu đối tượng, mà chúng ta sẽ tìm hiểu trong Phần 3, cho phép nạp chồng toán tử, tức là chúng ta có thể thay thế ý nghĩa thông thường của các ký hiệu toán tử bằng một số hành động cụ thể. Khi đó, nếu kiểu của i
và j
không phải là int
, mà là một lớp nào đó với phép cộng được nạp chồng, cách viết như vậy sẽ có hiệu quả, và trình biên dịch sẽ không đưa ra cảnh báo.
Câu lệnh đơn giản chỉ có thể được viết bên trong các câu lệnh ghép. Ví dụ, việc gọi hàm Print
bên ngoài một hàm sẽ không hoạt động:
Print("Hello ", Symbol());
void OnStart()
{
}
2
3
4
Chúng ta sẽ nhận được một loạt lỗi:
`Print` - unexpected token, probably type is missing?
`Hello, ` - declaration without type
`Hello, ` - comma expected
`Symbol` - declaration without type
`(` - comma expected
`)` - semicolon expected
`)` - expressions are not allowed on a global scope
2
3
4
5
6
7
Lỗi liên quan nhất trong trường hợp này là lỗi cuối cùng: expressions are not allowed in the global context
(biểu thức không được phép trong ngữ cảnh toàn cục).