Trắc Nghiệm Ôn Tập — Buổi 30: Hàm Trả Về & Tham Chiếu¶
Hướng dẫn: Chọn đáp án đúng nhất. Xem đáp án ở cuối trang.
Phần 1: Lý Thuyết Lệnh Return¶
Câu 1. Một hàm có kiểu trả về là int thì bên trong thân hàm BẮT BUỘC phải có lệnh gì?
- A.
cin - B.
cout - C.
returnkèm theo một giá trị số nguyên - D. Lệnh
break
Câu 2. Khẳng định nào sau đây về lệnh return là ĐÚNG NHẤT?
- A. Lệnh
returnchỉ ném giá trị ra ngoài, và chương trình tiếp tục chạy các lệnh bên dưới nó. - B. Lệnh
returnlập tức chấm dứt toàn bộ hoạt động của Hàm và trả quyền điều khiển (kèm kết quả) về cho hàmmain(). - C. Lệnh
returncó tác dụng tắt luôn toàn bộ phần mềm. - D. Một hàm có thể
returncùng lúc 5 giá trị khác nhau.
Câu 3. Nếu tôi gọi một hàm trả về (Ví dụ: int kq = tinhTong(2, 3);) nhưng tôi lại viết code là: tinhTong(2, 3); (Không có biến nào hứng lấy). Điều gì xảy ra?
- A. Báo lỗi cú pháp
- B. Hàm vẫn âm thầm chạy, tính ra kết quả 5, nhưng kết quả đó bị ném đi và rơi vào khoảng không (Bị lãng phí)
- C. Hàm sẽ in số 5 ra màn hình
- D. Gây crash máy
Câu 4. Trong hàm kiểm tra Số nguyên tố bool isPrime(int n), tại sao ta có thể tự tin viết lệnh return true; ở cuối cùng của hàm (nằm ngoài vòng lặp for)?
- A. Vì ta đoán mò nó là số nguyên tố
- B. Vì nếu nó KHÔNG phải số nguyên tố, nó đã bị lệnh
return false;nằm bên trong vòng lặp kết liễu từ trước rồi. Nếu nó sống sót đến tận lệnh cuối cùng, chứng tỏ nó thực sự là số nguyên tố. - C. Vì lệnh
return truechạy nhanh hơn - D. Do C++ bắt buộc phải có
Câu 5. Tôi có thể dùng lệnh gọi hàm trực tiếp bên trong biểu thức if được không? (Ví dụ: if (isEven(x) == true)).
- A. Không được, phải lưu ra biến
bool ketQua = isEven(x);trước. - B. Hoàn toàn hợp lệ, C++ sẽ tính kết quả của hàm trước rồi lấy nó thế vào chữ
if. Thậm chí có thể viết ngắn gọn làif (isEven(x)) - C. Được, nhưng tốc độ sẽ rất chậm.
- D. Chỉ dùng được với hàm
int.
Phần 2: Đọc Hiểu Mã Lệnh¶
Câu 6. Hàm sau bị lỗi gì?
- A. Lỗi biên dịch. Khai báo hàm là
int(hứa hẹn sẽ trả về số nguyên), nhưng bên trong lại không có bất kỳ lệnhreturnnào. (Nhiều trình biên dịch hiện đại sẽ báo cảnh báo hoặc lỗi "control reaches end of non-void function"). - B. Dư lệnh
cout - C. Hàm chạy đúng in ra kết quả bình thường
- D. Khai báo biến
ysai
Câu 7. Kết quả in ra của đoạn code sau là gì?
- A. 10 20 30
- B. 30
- C. 10
- D. 60 (Cộng lại)
Câu 8. Xét hàm sau:
void updateScore(int &score) {
score += 10;
}
int main() {
int diem = 50;
updateScore(diem);
cout << diem;
}
Kết quả in ra màn hình là?
- A. 50
- B. 60
- C. 10
- D. Lỗi
Câu 9. Để hàm có thể can thiệp làm thay đổi vĩnh viễn biến truyền vào, ta phải đặt dấu & ở đâu?
- A. Lúc gọi hàm trong
main(Ví dụ:updateScore(&diem);) - B. Ở phần khai báo tham số của hàm (Ví dụ:
void updateScore(int &score)) - C. Ở phần kiểu trả về (Ví dụ:
int& updateScore()) - D. Phải đặt ở cả 2 nơi
Câu 10. Nếu hàm void swap(int a, int b) (KHÔNG CÓ DẤU &) được gọi trong main. Biến x và y trong main có bị đổi chỗ cho nhau không?
- A. Có, đổi thành công.
- B. Không. Hàm chỉ đổi chỗ hai BẢN SAO cục bộ tên là
avàbcủa nó. Các bản sao này bị vứt vào thùng rác ngay khi hàm kết thúc. Biến gốcx, ykhông bị sứt mẻ gì. - C. Chương trình sẽ treo
- D. Đảo ngược mảng
Phần 3: Ứng Dụng Logic¶
Câu 11. Một hàm trong C++ có thể return về một Mảng (Array) tĩnh được không? (Ví dụ: int[] taoMang())
- A. Hoàn toàn được
- B. Không được. C++ không cho phép
returnthẳng một mảng tĩnh. Cách giải quyết phổ biến là truyền mảng đó bằng tham chiếu để hàm thao tác trực tiếp, hoặc dùng Mảng động (std::vector). - C. Được nhưng mảng tối đa 10 phần tử
- D. Được nếu mảng chứa chuỗi
Câu 12. Mảng 1 chiều tĩnh khi truyền vào hàm (Ví dụ: void sortArray(int a[], int n)) thì bản chất nó đang được truyền theo kiểu gì?
- A. Pass by Value (Tạo bản sao mảng)
- B. Pass by Reference (Truyền địa chỉ gốc). Do đó, hàm sắp xếp mảng làm việc cực kì trơn tru và biến đổi trực tiếp lên mảng ở
main. - C. Truyền chuỗi
- D. C++ tự tạo mảng mới
Câu 13. Trong hàm giải phương trình, tại sao người ta thích dùng kiểu trả về bool (Báo thành công / Thất bại) và nhét kết quả Toán học vào Tham chiếu &x?
- A. Vì hàm chỉ được trả về 1 thứ. Đưa kết quả toán vào Tham chiếu giúp hàm rảnh tay để
returntrạng thái True/False, rất thuận tiện cho hàmmainkiểm tra bằngif. - B. Do bắt buộc phải làm vậy
- C. Để chương trình chạy nhanh hơn
- D. Hàm
boolxử lý số thực tốt hơn
Câu 14. Kỹ thuật Return Early (Return sớm) mang lại lợi ích gì cho việc code?
- A. Rút ngắn thời gian biên dịch
- B. Loại bỏ bớt các khối
elselồng nhau (Nestedif-else). Giúp code phẳng ra (flat code), cực kỳ dễ đọc. - C. Tránh bị hack
- D. Báo lỗi ngay lập tức
Câu 15. Làm sao để truyền một string vào hàm mà KHÔNG bị copy tốn RAM (nhưng vẫn bảo vệ không cho hàm sửa nó)?
- A.
void inChuoi(string s) - B.
void inChuoi(string &s) - C.
void inChuoi(const string &s)(Chữconstkhóa dữ liệu, chữ&truyền địa chỉ gốc chống copy). Đây là chuẩn mực lập trình C++ chuyên nghiệp. - D. Không thể làm được
Đáp Án¶
Xem đáp án
| Câu | Đáp án | Giải thích |
|---|---|---|
| 1 | C | Đã hứa trả về int thì phải ném ra cái kết quả int đó bằng lệnh return. Không làm C++ sẽ nổi cáu. |
| 2 | B | Lệnh return là một dấu chấm hết quyền lực. Dùng nó để ngắt hàm ngay lập tức khi phát hiện dữ liệu lỗi. |
| 3 | B | Cỗ máy nhả nước trái cây ra nhưng bạn không cầm ly hứng. Nước đổ xuống đất lãng phí thao tác tính toán. |
| 4 | B | Logic loại trừ tuyệt vời của lệnh Return. Không bị chặn lại ở cửa nào thì nghiễm nhiên lọt tới cửa cuối cùng. |
| 5 | B | Hàm trả về được định giá trị trực tiếp như một biểu thức con, giúp mã nguồn tại main siêu gọn gàng. |
| 6 | A | Hàm hứa trả về int nhưng code quên mất lệnh return y; ở dòng cuối cùng. |
| 7 | C | Lệnh return 10; kích hoạt, hàm lập tức bị tắt ngấm. Mọi lệnh bên dưới trở thành mã rác (Unreachable code) vĩnh viễn không bao giờ được chạy. |
| 8 | B | Nhờ dấu tham chiếu &, biến score chính là biến diem. Phép cộng dồn += 10 tác động thẳng vào diem. Kết quả 60. |
| 9 | B | Cú pháp thiết lập liên kết Tham chiếu chỉ nằm ở trong Cặp ngoặc định nghĩa tham số của Hàm. |
| 10 | B | Sai lầm kinh điển nhất khi làm bài thi. Viết hàm Swap xong chạy thử thấy mảng vẫn không chịu đổi chỗ. Bệnh do thiếu dấu &. |
| 11 | B | Trong C/C++, mảng tĩnh (Static Array) không phải là "Công dân hạng nhất" (First-class citizen). Không thể ném qua lại như biến nguyên thủy được. Phải truyền địa chỉ của mảng. |
| 12 | B | Mảng (Array) tự mang bản chất là Con trỏ (Pointer). Khi truyền mảng vào hàm, nó mặc nhiên là Pass by Reference mà không cần đánh dấu &. |
| 13 | A | Một kĩ thuật phối hợp cực kì tinh tế trong lập trình hệ thống: Dùng Return để báo mã trạng thái, dùng Tham số trỏ để truyền tải hàng hóa (Dữ liệu). |
| 14 | B | Gặp sai \(\to\) Return. Gặp trường hợp ngoại lệ \(\to\) Return. Khiến cho logic chính của bài toán được bóc trần ra khỏi các cái kén else. |
| 15 | C | Kỹ thuật const Reference kết hợp tinh hoa: Siêu nhanh (Không tạo bản sao) + An Toàn 100% (Khóa không cho ghi đè). Thường dùng cho các String dài hàng trang giấy. |