Các phép toán khác
Chỉ số ( [] )
Khi truy cập phần tử thứ i của mảng, giá trị biểu thức là giá trị của biến có số thứ tự i.
Ví dụ:
array[i] = 3; // Gán giá trị 3 cho phần tử thứ i của mảng.
Chỉ số của mảng chỉ có thể là số nguyên. Các mảng từ bốn chiều trở xuống được phép. Mỗi chiều được đánh chỉ số từ 0 đến kích thước chiều
- 1. Trong trường hợp đặc biệt, đối với mảng một chiều gồm 50 phần tử, tham chiếu đến phần tử đầu tiên sẽ là array[0]
, còn phần tử cuối cùng sẽ là array[49]
.
Khi truy cập vượt quá giới hạn mảng, hệ thống thực thi sẽ tạo ra lỗi nghiêm trọng và chương trình sẽ bị dừng.
Gọi hàm với các đối số x1, x2, ..., xn
Mỗi đối số có thể đại diện cho một hằng số, biến hoặc biểu thức của kiểu tương ứng. Các đối số được truyền vào được phân tách bằng dấu phẩy và phải nằm trong dấu ngoặc đơn, dấu ngoặc mở phải theo sau tên của hàm được gọi.
Giá trị biểu thức là giá trị được hàm trả về. Nếu giá trị trả về thuộc kiểu void
, lời gọi hàm như vậy không thể được đặt ở bên phải trong phép toán gán. Lưu ý rằng các biểu thức x1, ..., xn
được thực thi chính xác theo thứ tự này.
Ví dụ:
int length=1000000;
string a="a",b="b",c;
//---Các phép toán khác
int start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);
2
3
4
5
6
7
8
9
10
11
Phép toán dấu phẩy ( , )
Các biểu thức được phân tách bằng dấu phẩy được thực thi từ trái sang phải. Tất cả các hiệu ứng phụ của việc tính toán biểu thức bên trái có thể xuất hiện trước khi biểu thức bên phải được tính toán. Kiểu và giá trị kết quả trùng với kiểu và giá trị của biểu thức bên phải. Danh sách các tham số được truyền (xem ở trên) có thể được xem như một ví dụ.
Ví dụ:
for(i=0,j=99; i<100; i++,j--) Print(array[i][j]);
Toán tử chấm ( . )
Để trực tiếp truy cập vào các thành viên công khai của cấu trúc và lớp, toán tử chấm được sử dụng. Cú pháp:
Tên_biến_của_kiểu_cấu_trúc.Tên_thành_viên
Ví dụ:
struct SessionTime
{
string sessionName;
int startHour;
int startMinutes;
int endHour;
int endMinutes;
} st;
st.sessionName="Asian";
st.startHour=0;
st.startMinutes=0;
st.endHour=9;
st.endMinutes=0;
2
3
4
5
6
7
8
9
10
11
12
13
Phép toán phân giải phạm vi ( :: )
Mỗi hàm trong chương trình MQL5 có phạm vi thực thi riêng. Ví dụ, hàm hệ thống Print() được thực hiện trong phạm vi toàn cục. Các hàm được nhập được gọi trong phạm vi của phần nhập tương ứng. Các hàm phương thức của lớp có phạm vi của lớp tương ứng. Cú pháp của phép toán phân giải phạm vi như sau:
[Tên_phạm_vi]::Tên_hàm(tham_số)
Nếu không có tên phạm vi, đây là chỉ dẫn rõ ràng để sử dụng phạm vi toàn cục. Nếu không có phép toán phân giải phạm vi, hàm sẽ được tìm kiếm trong phạm vi gần nhất. Nếu không có hàm trong phạm vi cục bộ, việc tìm kiếm được thực hiện trong phạm vi toàn cục.
Phép toán phân giải phạm vi cũng được sử dụng để định nghĩa hàm thành viên của lớp.
kiểu Tên_lớp::Tên_hàm(mô_tả_tham_số)
{
// thân hàm
}
2
3
4
Việc sử dụng nhiều hàm cùng tên từ các ngữ cảnh thực thi khác nhau trong một chương trình có thể gây ra sự mơ hồ. Thứ tự ưu tiên của các lời gọi hàm mà không chỉ định phạm vi rõ ràng là như sau:
- Phương thức lớp. Nếu không có hàm nào với tên được chỉ định trong lớp, chuyển sang cấp tiếp theo.
- Hàm MQL5. Nếu ngôn ngữ không có hàm như vậy, chuyển sang cấp tiếp theo.
- Hàm toàn cục do người dùng định nghĩa. Nếu không tìm thấy hàm với tên được chỉ định, chuyển sang cấp tiếp theo.
- Hàm được nhập. Nếu không tìm thấy hàm với tên được chỉ định, trình biên dịch trả về lỗi.
Để tránh sự mơ hồ trong lời gọi hàm, luôn chỉ định rõ ràng phạm vi hàm bằng cách sử dụng phép toán phân giải phạm vi.
Ví dụ:
#property script_show_inputs
#import "kernel32.dll"
int GetLastError(void);
#import
class CCheckContext
{
int m_id;
public:
CCheckContext() { m_id=1234; }
protected:
int GetLastError() { return(m_id); }
};
class CCheckContext2 : public CCheckContext
{
int m_id2;
public:
CCheckContext2() { m_id2=5678; }
void Print();
protected:
int GetLastError() { return(m_id2); }
};
void CCheckContext2::Print()
{
::Print("Terminal GetLastError",::GetLastError());
::Print("kernel32 GetLastError",kernel32::GetLastError());
::Print("parent GetLastError",CCheckContext::GetLastError());
::Print("our GetLastError",GetLastError());
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CCheckContext2 test;
test.Print();
}
//+------------------------------------------------------------------+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Phép toán lấy kích thước kiểu dữ liệu hoặc kích thước của bất kỳ đối tượng kiểu dữ liệu nào ( sizeof )
Sử dụng phép toán sizeof
, kích thước bộ nhớ tương ứng với một định danh hoặc kiểu có thể được xác định. Phép toán sizeof
có định dạng sau:
Ví dụ:
sizeof(biểu_thức)
Bất kỳ định danh nào, hoặc tên kiểu được đặt trong dấu ngoặc đơn có thể được sử dụng làm biểu thức. Lưu ý rằng tên kiểu void
không thể được sử dụng, và định danh không thể thuộc trường bit hoặc là tên hàm.
Nếu biểu thức là tên của một mảng tĩnh (tức là chiều đầu tiên được chỉ định), thì kết quả là kích thước của toàn bộ mảng (tức là tích của số phần tử và độ dài của kiểu). Nếu biểu thức là tên của một mảng động (chiều đầu tiên không được chỉ định), kết quả sẽ là kích thước của đối tượng của mảng động.
Khi sizeof
được áp dụng cho tên của kiểu cấu trúc hoặc lớp, hoặc cho định danh của kiểu cấu trúc hoặc lớp, kết quả là kích thước thực tế của cấu trúc hoặc lớp.
Ví dụ:
struct myStruct
{
char h;
int b;
double f;
} str;
Print("sizeof(str) = ",sizeof(str));
Print("sizeof(myStruct) = ",sizeof(myStruct));
2
3
4
5
6
7
8
Kích thước được tính toán tại giai đoạn biên dịch.
Xem thêm