มี 2 แนวคิดที่แยกจากกันที่นี่ -
- ขอบเขต (scope) ซึ่งกำหนดว่าชื่อสามารถเข้าถึงได้ที่ไหน - global และ local
- ระยะเวลาการจัดเก็บ (storage duration) ซึ่งกำหนดว่าตัวแปรถูกสร้างและทำลายเมื่อไหร่ - static และ auto
ขอบเขต (Scope)
ตัวแปรท้องถิ่นสามารถใช้ได้เฉพาะคำสั่งที่อยู่ภายในฟังก์ชันหรือบล็อกโค้ดนั้น ตัวแปรท้องถิ่นไม่เป็นที่รู้จักของฟังก์ชันอื่นๆ เอง
ตัวอย่าง
#include <iostream>
using namespace std;
int main () {
// ประกาศตัวแปรท้องถิ่น:
int a, b;
int c;
// เริ่มต้นค่า
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
ผลลัพธ์ -
30
ตัวแปรกลางถูกกำหนดนอกฟังก์ชันทั้งหมด ปกติอยู่ด้านบนของโปรแกรม ตัวแปรกลางจะเก็บค่าไว้ตลอดอายุของโปรแกรม ตัวแปรกลางสามารถเข้าถึงได้จากฟังก์ชันใดก็ได้
ตัวอย่าง
#include <iostream>
using namespace std;
// ประกาศตัวแปรกลาง:
int g;
int main () {
// ประกาศตัวแปรท้องถิ่น:
int a, b;
// เริ่มต้นค่า
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
ผลลัพธ์ -
30
ระยะเวลาการจัดเก็บ (Storage duration)
ตัวแปรอัตโนมัติ (Automatic variables) คือตัวแปรท้องถิ่นที่อายุสิ้นสุดลงเมื่อการทำงานออกจากขอบเขตของมัน และถูกสร้างใหม่เมื่อเข้าขอบเขตอีกครั้ง
ตัวอย่าง
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // พิมพ์ 1 1 1 1 1 - ค่าก่อนหน้าสูญหาย
}
ตัวแปร static มีอายุจนจบโปรแกรม หากเป็นตัวแปรท้องถิ่น ค่าของมันจะคงอยู่เมื่อการทำงานออกจากขอบเขต
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // พิมพ์ 1 2 3 4 5 - ค่าคงอยู่
}
โปรดทราบว่า keyword static มีความหมายอื่นๆ อีกมากนอกจาก static storage duration นอกจากนี้ใน C++ keyword auto ไม่ได้หมายถึง automatic storage duration อีกต่อไป มันหมายถึง automatic type deduction (การอนุมานชนิดอัตโนมัติ) จาก initializer ของตัวแปร