À, chủ topic không học ngôn ngữ Pascal mà nhảy vô học C ngay nên mới có sự rối loạn như vậy.
Cần biết qua chút về “hàm”: Trong Pascal thì người ta phân biệt giữa hai loại “hàm”: 1. Hàm có nhận giá trị trả về, tên gọi nó là function; 2. Thủ tục: không nhận giá trị trả về, tên gọi nó là procedure.
Còn trong C, người ta gọi tất là function , tức gồm cả hàm (function) và thủ tục (procedure) bên Pascal.
Vậy, câu hỏi đặt ra là làm sao nhận biết lúc nào hàm thực sự là function, lúc nào hàm là có bản chất procedure bên C?
Cứ thấy cái nào mà có khai báo:
void tên-hàm() {
}
thì cái này đích thị là procedure bên Pascal.
Hiểu một cách rất đơn giản: đây là nơi gom các khai báo, gọi hàm được cung cấp sẵn bởi C, hoặc read/ write/ làm cái gì đó - ngoài việc tính toán biểu thức. Khi có từ void đứng đầu, thì function này không nhận giá trị trả về, và không lưu vào đâu hết, thực hiện xong không có lỗi là im re. Đây đích thị có bản chất là procedure.
Còn nếu thấy khai báo dạng:
int tên-của-hàm(đối số nếu có) {
return value;
}
hoặc:
double tên-của-hàm(đối số nếu có) {
return value;
}
thì lúc này ta thấy người tra khai báo có kiểu dữ liệu đứng trước hàm, ở 2 ví dụ trên là int, double , lúc này, từ hàm nó giống y như giải toán, có dữ liệu đầu vào, sau khi tính toán đã đời thì cần phải trả về giá trị (kết quả) để sử dụng trong các biểu thức tính toán khác và/ hoặc xuất ra. Vậy, nếu nó trả về mà cứ hiện lên màn hình thì quá bất tiện, cho nên, lúc này tên-của-hàm đóng vai trò gần như một biến, và giá trị nó nằm trong đó, ta cần thì write/ print nó ra hoặc ta gán cho một biến nào đó để dùng.
Ví dụ về hàm không có giá trị trả về:
void congHaiSo() { // ví dụ đầu (*)
viết ra dòng nhắc nhập giá trị a;
đọc giá trị a;
viết ra dòng nhắc nhập giá trị b;
đọc giá trị b;
làm toán cộng a + b;
viết ra kết quả ở màn hình.
(ở đây không có return gì hết)
}
Còn hàm có giá trị trả về:
int congHaiSo(int a, int b) { // ví dụ sau (**)
lấy hai giá trị ở tham số a, b trên thực hiện việc cộng, giả sử có biến trung gian tmp = a + b;
return tmp; # tức là gán biến tmp trả về cho hàm, vì bên ngoài hàm không thể "sờ" được tmp.
}
Ở ví dụ đầu (*), ta không thể:
printf("%d", congHaiSo()); được, vì lúc này hàm congHaiSo thực chất là 1 procedure. Nhưng ở ví dụ sau (**) thì ta có thể:
printf("%d", congHaiSo(4,5)); và nó cho giá trị là 9.
Thêm một dấu hiệu nhận biết nữa là function có trả về thường hay có đối số, tức là int tên-hàm(đối số, đối số, đối số) { làm gì đó; return }, còn nếu không có giá trị trả về, nó ít khi có đối số mà void tên-hàm(void nốt) { làm gì đó }
Nếu chủ topic chưa hiểu nữa thì vui lòng kiếm một cuốn sách tốt để đọc, ở đó họ giải thích rất kỹ. Nếu vẫn bó tay, kiếm cuốn lập trình Pascal đọc trước để hiểu sơ qua về lập trình là gì, vì bắt đầu với C là quá khó với một số người.