Hỏi về vai trò của static và main(number) trong đoạn code này?

#include <stdio.h> 
int main() 
{ 
	static int i = 5; 
	if (--i){ 
		printf("%d ", i); 
		main(10);
	} 
}

Kết quả compiler: 4 3 2 1
Mình tìm hiểu trên mạng thì biết sơ sơ:
static

là từ khóa để khai báo tài nguyên này thuộc về file và chỉ có thể được nhìn thấy bởi các phương thức khác trong file.
Các phương thức nằm ngoài file (Nằm ngoài namespace, package) sẽ không thể truy cập được.

Còn main(10) là lặp lại hàm int main() ? ( vai trò giống như while(true)/ while(1==1))?
Cuối cùng, tại sao khi bỏ static thì compiler chạy số 4 4 4... mãi.

Bác dùng compiler nào vậy. Nếu dùng g++ compile đoạn code đó sẽ bị lỗi ngay.
Nó sẽ hét vào mặt mình là " too many arguments to function ‘int main()’ "

Nếu bác dùng compiler nào đó mà có thể compile được code này thì đoạn code này có thể giải thích như sau:

  1. gọi hàm main() trong hàm main() là một dạng đệ quy.
  2. trong các lần gọi đệ quy thì do biến i là biến static nên nó sẽ không khởi tạo lại. Giá trị của nó sẽ giảm dần cho đến 0 và không vào if nữa ==> thoát CT.
  3. khi bác bỏ static thì mỗi lần gọi đệ quy, biến i sẽ được khởi tạo lại ==> if sẽ luôn thỏa điều kiện và gọi đệ quy vô tận.
3 Likes

Mình dùng gcc, định dạng .c
Nếu chạy .c chạy trên g++ thì sẽ biên dịch trên c++ và sẽ bị lỗi, (mình cũng bị vậy); nên mới dùng gcc để " thuần " c luôn :grinning:

:grin: sorry bác. Tay tôi nhanh hơn não. Không để ý

cái số 10 đó không có ý nghĩa gì đâu bác. Đâu bác thử sữa nó thành 1,2,3… thử đi. Nó vẫn ra kết quả vậy thôi.

2 Likes

Cảm ơn nhiều, cho hỏi vai trò của static còn gì khác nữa không?( đang luyện tiếng anh, nên mấy cái tài liệu tiếng anh chỗ được, chỗ không):grinning:

“là từ khóa để khai báo tài nguyên này thuộc về file và chỉ có thể được nhìn thấy bởi các phương thức khác trong file.”
Câu trên có nghĩa là : khi khai báo với static thì biến, function đó chỉ có thể được truy xuất bên trong file (.c , .cpp) mà nó được khai báo ( tất nhiên là cũng phải cùng scope). Những file khác sẽ không thể truy xuất đến nó. Tính chất đó làm rõ vai trò của static so với biến toàn cục (global variable). Biến toàn cục hoàn toàn có thể khai báo ở file này và extern nó ở file khác,.

2 Likes

Khi ko có tham số hình thức:
C++: không truyền được cái gì cả, nếu có sẽ báo lỗi biên dịch
C: truyền thoải mái và hàm ko bắt được gì (có khi là undefined?)

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?