Bỏ qua

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. return kè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 return chỉ 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 return lậ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àm main().
  • C. Lệnh return có tác dụng tắt luôn toàn bộ phần mềm.
  • D. Một hàm có thể return cù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 true chạ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ì?

int nhanDoi(int x) {
    int y = x * 2;
    cout << y;
}
  • 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ệnh return nà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 y sai

Câu 7. Kết quả in ra của đoạn code sau là gì?

int thuNghiem() {
    return 10;
    return 20;
    return 30;
}

int main() {
    cout << thuNghiem();
}
  • 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 xy 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à ab củ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ốc x, y khô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 return thẳ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 để return trạng thái True/False, rất thuận tiện cho hàm main kiểm tra bằng if.
  • 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 bool xử 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 else lồng nhau (Nested if-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ữ const khó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.