Có hai khái niệm riêng biệt:
- Phạm vi (scope) – quyết định nơi tên có thể truy cập: global và local.
- Thời gian lưu trữ (storage duration) – quyết định khi nào biến được tạo/hủy: static và auto.
Phạm vi
Biến cục bộ chỉ dùng được bên trong hàm/khối. Biến toàn cục định nghĩa ngoài mọi hàm, truy cập được mọi nơi.
Ví dụ cục bộ
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 20, c = a + b;
cout << c;
return 0;
}
Đầu ra: 30
Ví dụ toàn cục
#include <iostream>
using namespace std;
int g;
int main() {
int a = 10, b = 20;
g = a + b;
cout << g;
return 0;
}
Đầu ra: 30
Thời gian lưu trữ
Automatic (auto): biến cục bộ, vòng đời kết thúc khi rời khỏi phạm vi, tạo lại khi vào lại phạm vi.
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // in 1 1 1 1 1 - giá trị cũ mất đi
}
Static: vòng đời kéo dài đến hết chương trình. Nếu là biến cục bộ, giá trị persists khi rời phạm vi.
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // in 1 2 3 4 5 - giá trị lưu lại
}
Lưu ý: từ khóa static còn nhiều nghĩa khác. Từ C++11, auto không còn nghĩa là automatic storage duration mà là suy diễn kiểu tự động từ khởi tạo.