Giá trị trả về
Các hàm có thể trả về giá trị của các kiểu tích hợp, cấu trúc với các trường của kiểu tích hợp, cũng như con trỏ đến hàm và con trỏ đến các đối tượng lớp. Tên kiểu được viết trong định nghĩa hàm trước tên hàm. Nếu hàm không trả về gì, nó nên được gán kiểu void
.
Để trả về từ một hàm mảng, bạn phải sử dụng các tham số được truyền theo tham chiếu (xem Tham số giá trị và tham số tham chiếu).
Một giá trị được trả về bằng câu lệnh return
, trong đó một biểu thức được chỉ định sau từ khóa return
. Có thể sử dụng bất kỳ một trong hai dạng sau:
return expression;
hoặc:
return (expression);
Nếu hàm có kiểu void
, thì câu lệnh return
được đơn giản hóa:
return;
Câu lệnh return
không thể chứa bất kỳ biểu thức nào bên trong hàm void
: trình biên dịch sẽ tạo ra lỗi "'return' - 'void' function returns a value" (hàm 'void' trả về một giá trị).
Đối với các hàm như vậy, về lý thuyết, không cần thiết phải sử dụng return
ở cuối khối chứa phần thân hàm. Chúng ta đã thấy điều này trong ví dụ về hàm OnStart
.
Nếu hàm có kiểu khác void
, thì câu lệnh return
phải là bắt buộc. Nếu không có, sẽ xảy ra lỗi biên dịch "not all control paths return a value" (không phải tất cả các đường điều khiển đều trả về giá trị).
int func(void)
{
if(IsStopped()) return; // lỗi: hàm phải trả về một giá trị
// lỗi: không phải tất cả các đường điều khiển đều trả về giá trị
}
2
3
4
5
Điều quan trọng cần lưu ý là phần thân hàm có thể có nhiều câu lệnh return
. Đặc biệt, trong trường hợp thoát sớm theo điều kiện. Bất kỳ câu lệnh return
nào cũng ngắt việc thực thi hàm tại vị trí của nó.
Nếu một hàm phải trả về một giá trị (vì nó không phải kiểu void
), và giá trị đó không được chỉ định trong toán tử return
, trình biên dịch sẽ tạo ra lỗi "function must return a value" (hàm phải trả về một giá trị). Phiên bản đúng của hàm func
được đưa ra dưới đây (FuncReturn.mq5
).
int func(void)
{
if(IsStopped()) return 0;
return 1;
}
2
3
4
5
Nếu giá trị trả về khác với kiểu hàm được chỉ định, trình biên dịch sẽ thử một chuyển đổi ngầm. Trong trường hợp các kiểu yêu cầu chuyển đổi rõ ràng, một lỗi sẽ được tạo ra.
Để trả về một giá trị, một biến tạm thời được tạo ngầm và cung cấp cho mã gọi.
Sau khi chúng ta tìm hiểu về các kiểu đối tượng (xem chương về Lớp) và khả năng trả về con trỏ đến các đối tượng từ hàm, chúng ta sẽ quay lại xem xét cách truyền chúng một cách an toàn. Không giống như C++, các hàm trong MQL5 không thể trả về tham chiếu. Việc cố gắng khai báo một hàm với dấu và trong kiểu kết quả dẫn đến lỗi "'&' - reference cannot used" (tham chiếu không thể được sử dụng).