Vì các hàm đều có thể truy nhập và thay đổi giá trị trên các biến toàn cục, cho nên kết quả của hàm này có thể truyền sang hàm khác.
Đặc điểm: không cần truyền tham số cho hàm thông qua các tham số hình thức (vì các hàm xử lý trực tiếp trên các biến toàn cục) cho nên đơn giản. Tuy nhiên, khi viết chương trình ta nên hạn chế sử dụng biến toàn cục nếu không
82
cần thiết (vì dễ gây ra hiệu ứng lề không mong muốn, cấu trúc chương trình không sáng sủa và mất tính riêng tư của các hàm).
Ví dụ 9:
Chương trình
#include <stdio.h> #include <conio.h> // khai bao prototype void oddeven(); void negative();
//khai bao bien toan cuc int inum;
void main(void) {
printf("Nhap vao 1 so nguyen : ");
scanf("%d", &inum);
oddeven();
negative();
getch();
}
// ham kiem tra chan le void oddeven()
{
if (inum % 2)
printf("%d la so le.\n", inum);
else
printf("%d la so chan.\n", inum);
}
//ham kiem tra so am void negative()
83
{
if (inum < 0)
printf("%d la so am.\n", inum);
else
printf("%d la so duong.\n", inum);
}
Kết quả in ra màn hình
Nhap vao 1 so nguyen: 3 3 la so le.
3 la so duong.
Giải thích chương trình
Chương trình trên gồm 2 hàm oddeven và negative, 2 hàm này
bạn thấy không có tham số để truyền biến inum vào xử lý nhưng vẫn cho kết quả đúng. Do chương trình sử dụng biến inum toàn cục (dòng.9) nên biến này có ảnh hưởng đến toàn bộ chương trình mỗi khi gọi và sử dụng nó. Xét tình huống sau: Giả sử trong hàm negative ta khai báo biến inum có kiểu int như sau:
void negative() {
int inum; …. }
Khi đó chương trình sẽ cho kết quả sai! Do các câu lệnh trong
hàm negative sử dụng biến inum sẽ sử dụng biến inum khai báo trong hàm negative và lúc này biến inum toàn cục không có tác dụng đối với các câu lệnh trong hàm này. Biến inum khai báo trong hàm negative chỉ có ảnh hưởng trong phạm vi hàm và chu trình sống của nó bắt đầu từ lúc gọi hàm đến khi thực hiện xong.
84
Lưu ý: Cẩn thận khi đặt tên biến, xác định rõ phạm vi của biến khi sử dụng để có thể dễ dàng kiểm soát chương trình.