Chào các Gen Z tương lai của ngành lập trình! Anh là Creyt đây, và hôm nay chúng ta sẽ "bóc tách" một từ khóa mà nghe thì đơn giản nhưng lại là xương sống của mọi chương trình: return.
return: Chốt đơn, nhận quà!
Hãy tưởng tượng thế này: Mỗi hàm (function) trong C++ của chúng ta giống như một "challenge" trên TikTok vậy. Bạn thực hiện các bước, quay video, thêm hiệu ứng... Và sau khi hoàn thành tất cả những công đoạn đó, bạn cần phải "Submit" (nộp bài) để mọi người thấy thành quả, đúng không? Từ khóa return chính là cái nút "Submit" thần thánh đó!
Nó có hai nhiệm vụ chính, nhớ kỹ nhé:
- Trả về một giá trị: Nếu challenge của bạn là "làm bánh", thì sau khi xong, bạn phải "trả về" cái bánh đó cho người yêu cầu.
- Kết thúc hàm ngay lập tức: Dù bạn đang ở giữa chừng một đống code, chỉ cần
returnmột cái là "game over" cho hàm đó, nó sẽ dừng lại và chuyển quyền điều khiển về nơi đã gọi nó.
Code Ví Dụ Minh Họa: "Show me the code!"
1. Hàm void: Chỉ "Submit", không "Trả quà"
Khi hàm của bạn không cần trả về giá trị nào (ví dụ: chỉ in ra màn hình, hay thay đổi trạng thái gì đó), bạn dùng void. Lúc này return chỉ có tác dụng kết thúc hàm.
#include <iostream>
// Hàm này chỉ chào hỏi, không cần trả về gì cả
void greetGenz() {
std::cout << "Yo, Gen Z! Chào mừng đến với thế giới code!" << std::endl;
return; // Dù không bắt buộc (nếu là dòng cuối), nhưng dùng để minh họa việc kết thúc hàm
std::cout << "Dòng này sẽ không bao giờ được chạy đâu, vì hàm đã return rồi!" << std::endl;
}
int main() {
greetGenz(); // Gọi hàm chào hỏi
return 0; // Hàm main cũng return đấy, để báo cho hệ điều hành biết chương trình chạy ngon lành
}
2. Hàm có giá trị trả về: "Làm xong, có sản phẩm!"
Đây là trường hợp phổ biến nhất. Hàm thực hiện một phép tính, một logic nào đó và "trả lại" kết quả.
#include <iostream>
#include <string>
// Hàm tính tổng hai số, và trả về kết quả là một số nguyên (int)
int addTwoNumbers(int num1, int num2) {
int sum = num1 + num2;
return sum; // Trả về giá trị của biến sum
}
// Hàm kiểm tra tuổi, trả về một chuỗi thông báo
std::string checkAgeForAccess(int age) {
if (age < 18) {
return "Xin lỗi, bạn chưa đủ tuổi để truy cập. Quay lại sau nhé!"; // Trả về chuỗi và thoát hàm ngay
}
return "Chào mừng! Bạn đã đủ tuổi để khám phá."; // Chỉ chạy nếu tuổi >= 18
}
int main() {
int result = addTwoNumbers(5, 7); // Biến result sẽ nhận giá trị 12
std::cout << "Tổng của 5 và 7 là: " << result << std::endl; // Output: 12
std::cout << checkAgeForAccess(16) << std::endl; // Output: Xin lỗi, bạn chưa đủ tuổi...
std::cout << checkAgeForAccess(20) << std::endl; // Output: Chào mừng! Bạn đã đủ tuổi...
return 0;
}

Mẹo từ Creyt (Best Practices): Ghi nhớ và dùng thực tế
- "Chốt đơn" mọi ngóc ngách: Nếu hàm của bạn được khai báo là sẽ trả về một giá trị (không phải
void), thì phải đảm bảo rằng mọi con đường có thể đi trong hàm đều dẫn đến một câu lệnhreturn. Không là compiler (cái ông khó tính) sẽ la làng đấy! - "Return sớm = Thoát sớm": Trong nhiều trường hợp, đặc biệt là khi xử lý lỗi hoặc các điều kiện đặc biệt, việc
returnsớm giúp code của bạn gọn gàng hơn, dễ đọc hơn. Thay vì phải lồng nhiềuif-else, bạn có thể kiểm tra điều kiện lỗi vàreturnngay. Giống như "kiểm tra vé" ở cửa rạp, ai không có vé thìreturnvề nhà luôn, không cần phải đi vào trong rồi mới đuổi ra. - "Kiểu dữ liệu phải chuẩn chỉ": Cái bánh bạn làm (giá trị trả về) phải đúng loại mà người ta yêu cầu (kiểu dữ liệu khai báo của hàm). Hàm
intthì phảireturnsố nguyên, hàmstd::stringthì phảireturnchuỗi, không được lộn xộn.
Góc học thuật Harvard (nhưng vẫn dễ hiểu): Hợp đồng hàm số
Từ góc độ học thuật mà nói, return là một phần cốt lõi của ngữ nghĩa hàm số (function semantics) và quản lý luồng điều khiển (control flow management). Khi bạn định nghĩa một hàm với kiểu trả về không phải void, bạn đang thiết lập một "hợp đồng" với bất kỳ đoạn code nào gọi hàm đó. Hợp đồng nói rằng: "Tôi sẽ thực hiện một tác vụ, và khi hoàn thành (hoặc gặp một điều kiện dừng), tôi sẽ cung cấp cho bạn một giá trị thuộc kiểu dữ liệu X."
return không chỉ đơn thuần là gửi một giá trị; nó là cơ chế chính để chuyển giao quyền điều khiển từ hàm con (callee) trở lại hàm gọi (caller), đồng thời mang theo "kết quả" của quá trình xử lý. Điều này là nền tảng cho việc xây dựng các chương trình module hóa và có khả năng tái sử dụng cao.
Ứng dụng thực tế: return có mặt khắp nơi!
- Game Development: Khi bạn bắn một viên đạn, hàm
calculateDamage(bulletType, distance)sẽreturnmột số nguyên là lượng sát thương gây ra. HàmcheckCollision(playerPos, enemyPos)sẽreturn truenếu va chạm,falsenếu không. - Website/API Backend: Khi bạn đăng nhập vào Facebook, Instagram, hàm
authenticateUser(username, password)sẽreturnmộttoken(chuỗi) nếu đăng nhập thành công, hoặcreturn null/falsekèm theo mã lỗi nếu sai mật khẩu. - Ứng dụng di động: Khi bạn dùng Google Maps tìm đường, hàm
calculateRoute(start, end)sẽreturnmột đối tượng chứa danh sách các điểm, thời gian ước tính, v.v. - Hệ điều hành: Ngay cả hàm
main()của chúng ta cũngreturn 0để báo cho hệ điều hành biết rằng chương trình đã chạy thành công. Nếu có lỗi, nó có thểreturnmột số khác0.
Thử nghiệm của Creyt và lời khuyên chân thành
Hồi anh mới tập tành code, anh cũng hay quên mất vụ return này lắm, đặc biệt là với các hàm int hay string. Compiler báo lỗi đỏ lòm mới nhận ra. Dần dần, anh hiểu rằng return không chỉ là một cú pháp, mà nó là lời cam kết của hàm với phần còn lại của chương trình.
Nên dùng return khi nào?
- Khi hàm của bạn cần tạo ra một kết quả cụ thể để một phần khác của chương trình sử dụng. Đây là trường hợp phổ biến nhất.
- Khi bạn muốn dừng hàm ngay lập tức vì một điều kiện nào đó (ví dụ: dữ liệu đầu vào không hợp lệ, lỗi, hoặc đã đạt được mục tiêu cần thiết và không cần xử lý thêm). Đây là kỹ thuật "guard clause" rất hiệu quả.
- Trong hàm
main(): Luônreturn 0khi chương trình chạy thành công, và một giá trị khác 0 (ví dụ1) khi có lỗi. Điều này giúp các script tự động hoặc các chương trình khác biết được trạng thái của ứng dụng của bạn.
return không chỉ là một từ khóa, nó là một công cụ mạnh mẽ để kiểm soát luồng chương trình và tạo ra các hàm có ý nghĩa. Hãy dùng nó một cách thông minh, và code của bạn sẽ trở nên mạch lạc, dễ hiểu hơn rất nhiều!
Thuộc Series: C++
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!