সি ভ্যারিয়েবলের স্কোপ এবং লাইফটাইম - C variable scope and lifetime
সি ভ্যারিয়েবলের স্কোপ এবং লাইফটাইম
সি প্রোগ্রামিং এ প্রতিটি ভ্যারিয়েবলের দুটি বৈশিষ্ট্য থাকে। যথাঃ
- টাইপ
- স্টোরেজ ক্লাস
টাইপ দ্বারা ভ্যারিয়েবলের ডাটা টাইপকে বুঝায় এবং স্টোরেজ ক্লাস ভ্যারিয়েবলের স্কোপ এবং লাইফটাইম নির্ধারন করে।
সি প্রোগ্রামিং এ চার ধরনের স্টোরেজ ক্লাস আছে।
- অটোম্যাটিক-automatic
- এক্সটার্নাল-external
- স্ট্যাটিক-static
- রেজিস্টার-register
সি লোকাল ভ্যারিয়েবল
ফাংশনের মধ্যে ডিক্লেয়ার করা ভ্যারিয়েবল-সমূহকে অটোম্যাটিক বা লোকাল ভ্যারিয়েবল বলা হয়।
লোকাল ভ্যারিয়েবল-সমূহ শুধুমাত্র ফাংশনের মধ্যে বিদ্যমান থাকে। ফাংশনের কাজ সম্পন্ন হয়ে গেলে লোকাল ভ্যারিয়েবল খতম হয়ে যায়।
int main() { int num; // এখানে num হলো main() ফাংশনের লোকাল ভ্যারিয়েবল ... .. ... } void add() { int num1; // এখানে num1 হলো add() ফাংশনের লোকাল ভ্যারিয়েবল ... .. ... }
সি গ্লোবাল ভ্যারিয়েবল
ফাংশনের বাহিরে ডিক্লেয়ার করা ভ্যারিয়েবল-সমূহকে গ্লোবাল বা এক্সটার্নাল ভ্যারিয়েবল বলা হয়। যেকোনো ফাংশন থেকে গ্লোবাল বা এক্সটার্নাল ভ্যারিয়েবল-সমূহকে এক্সেস করা যায়।
উদাহরনঃ গ্লোবাল ভ্যারিয়েবল
#include <stdio.h>
void display();
int count = 3; // গ্লোবাল ভ্যারিয়েবল
int main()
{
//count ভ্যারিয়েবলকে main() ফাংশনে ডিক্লেয়ার করা হয় নি
++count;
display();
return 0;
}
void display()
{
// count ভ্যারিয়েবলকে display() ফাংশনে ডিক্লেয়ার করা হয় নি
++count;
printf("count = %d", count);
}
আউটপুট
count = 5
extern কিওয়ার্ড
ধরুন, একটি গ্লোবাল ভ্যারিয়েবলকে file1
এ ডিক্লেয়ার করা হয়েছে। আপনি যদি ভিন্ন আরেকটি ফাইল file2
থেকে ঐ ভ্যারিয়েবলকে এক্সেস করতে চান তাহলে কম্পাইলার অভিযোগ করবে।
এই সমস্যা সমাধানের জন্য file2
তে extern
কীওয়ার্ড ব্যবহার করা হয় যা ফাইলকে নির্দেশ করে যে, এক্সটার্নাল ভ্যারিয়েবলকে ভিন্ন কোনো ফাইলে ডিক্লেয়ার(declare) করা হয়েছে।
সি রেজিস্টার ভ্যারিয়েবল
সি প্রোগ্রামিং এ রেজিস্টার ভ্যারিয়েবল ডিক্লেয়ারের জন্য register
কীওয়ার্ড ব্যবহৃত হয়। রেজিস্টার ভ্যারিয়েবলকে লোকাল ভ্যারিয়েবলের তুলনায় দ্রুত গতির মনে করা হয়।
যাইহোক আধুনিক কম্পাইলারসমূহ কোড অপটিমাইজেশনের জন্য খুবই ভাল এবং যাতে রেজিস্টার ভ্যারিয়েবল ব্যবহৃত প্রোগ্রাম দ্রুত গতি সম্পন্ন হওয়ার সুযোগ খুবই কম থাকে।
সম্প্রসারিত সিস্টেমে ব্যবহৃত এপ্লিকেশনের জন্য কোড কিভাবে অপটিমাইজ করতে হয় তা পূর্বে থেকে জানা না থাকলে রেজিস্টার ভ্যারিয়েবল ব্যবহারের কোনো প্রয়োজন নাই।
সি স্ট্যাটিক ভ্যারিয়েবল
সি প্রোগ্রামিং এ স্ট্যাটিক static
ব্যবহৃত হয়। উদাহরণস্বরূপঃ
static int age;
প্রোগ্রামে যখন ফাংশনের কাজ শেষ হয়ে যায় তখন এর সঙ্গে এর ভেতরের লোকাল ভ্যারিয়েবল গুলোও নিঃশেষ হয়ে যায়। প্রোগ্রাম শেষ না হওয়া পর্যন্ত কোনো লোকাল ভ্যারিয়েবলকে জীবিত রাখার জন্য static
কীওয়ার্ড ব্যবহৃত হয়।
প্রোগ্রাম শেষ না হওয়া পর্যন্ত স্ট্যাটিক ভ্যারিয়েবলের ভ্যালু বিদ্যমান থাকে।
উদাহরনঃ স্ট্যাটিক ভ্যারিয়েবল
#include <stdio.h>
void display();
int main()
{
display();
display();
}
void display()
{
static int count = 0;
printf("%d ",count);
count += 10;
}
আউটপুট
0 10
প্রথম ফাংশন কলে count ভ্যারিয়েবলের ভ্যালু 0 ছিল , দ্বিতীয় ফাংশন কলে এর ভ্যালু বৃদ্ধি হয়ে 10 হয়।
দ্বিতীয় ফাংশন কলের সময় count ভ্যারিয়েবলের ভ্যালু পূনরায় 0 এসাইন হয় না। কারণ count এখানে স্ট্যাটিক ভ্যারিয়েবল। অবশেষে 10 স্ক্রিনে প্রদর্শিত হয়।