স্কোপ : C ভাষায় Scope এর ধারণা

যারা প্রোগ্রামিং ভাল করে বুঝতে চান স্কোপ সম্পর্কে ধারণা থাকা তাদের জন্য আবশ্যিক।

স্কোপ হচ্ছে একটি এলাকা। স্কোপ হচ্ছে এমন একটি এলাকা যে এলাকায় কোন ভ্যারিয়েবল এর নিজস্ব অস্তিত্ব বিদ্যমান।

সব ভ্যারিয়েবল এরই নির্দিষ্ট স্কোপ আছে। স্কোপ হচ্ছে ভ্যারিয়েবল এর নিজস্ব এলাকা। নিজস্ব স্কোপের বাইরে কোন ভ্যারিয়েবল অর্থহীন, অস্তিত্বহীন।

কোন ভ্যারিয়েবলকে যে স্কোপে ডিক্লেয়ার করা হয়, সেই স্কোপ ও তার অভ্যন্তরীণ অন্যান্য স্কোপে সেটি কাজ করতে পারে। তার বাইরের অন্য কোন এলাকায় বা স্কোপে সে কাজ করতে পারে না।

আমরা যখন একটি ফাকা ফাইলে কোড লিখা শুরু করি, তখন সমগ্র ফাকা জায়গাটিই একটি স্কোপ হিসেবে কাজ করে যাকে গ্লোবাল স্কোপ বলে। এই গ্লোবাল স্কোপে যেসব ভ্যারিয়েবল ডিক্লেয়ার করা হয় তারা এই সমগ্র গ্লোবাল স্কোপ ও এর অভ্যন্তরীণ অন্যান্য স্কোপে কাজ করতে পারে। অভ্যন্তরীণ স্কোপ গুলোকে বলা হয় লোকাল স্কোপ।

মূলত এই কারণেই সমস্ত ফাংশনগুলোকে গ্লোবাল স্কোপে ডিক্লেয়ার করা হয় যাতে ঐ প্রোগ্রামের যে কোন অংশে তারা ব্যবহৃত হতে পারে।

গ্লোবাল স্কোপকে অনেকগুলো লোকাল স্কোপে ভাগ করা যায়। একজোড়া কার্লি ব্রেস দিয়ে স্কোপের সীমানা নির্ধারণ করা হয়। উদাহরণস্বরূপ আমরা বলতে পারি main() ফাংশন এর পরের কার্লি ব্রেসের কথা। ওপেনিং ব্রেস থেকে ক্লোজিং ব্রেস পর্যন্ত পুরা এলাকাটিই main() ফাংশনের লোকাল স্কোপ।

কোন স্কোপে যখন কোন ভ্যারিয়েবল ডিক্লেয়ার করা হয় তখন তা ঐ স্কোপে অস্তিত্বশীল। ঐ স্কোপে ঐ নামে আর কোন ভ্যারিয়েবল ডিক্লেয়ার করা যায় না। কিন্তু ভিন্ন ভিন্ন স্কোপে একই নামের একাধিক ভ্যারিয়েবল থাকতে পারে। কারণ, তাদের নাম এক হলেও, স্কোপ ভিন্ন হবার কারণে তারা আসলে ভিন্ন ভিন্ন সত্ত্বা। যেমনঃ

#include<stdio.h>

int main()
{
    int x;
    char x;

return 0;
}

উপরের কোড সেগমেন্ট রান করলে এরর দেখাবে। কিন্তু,

#include<stdio.h>
int x;
int main()
{
    char x;

return 0;
}

কোডটি কোন এরর দেখাবে না। কারণ, x কে দুইটি ভিন্ন ভিন্ন স্কোপে দুইবার ডিক্লেয়ার করা হয়েছে, যা লিগ্যাল।

যদি দুইটি ভিন্ন ভিন্ন স্কোপে একই নামের ভ্যারিয়েবল থাকে তাহলে যে ভ্যারিয়েবল যে স্কোপে আছে সেই স্কোপে সেই নামে ব্যবহার করলে সেই ভ্যারিয়েবলই ব্যবহৃত হবে। অন্য স্কোপের ভ্যারিয়েবল এখানে ব্যবহৃত হবে না। একই নামে গ্লোবাল ও লোকাল স্কোপে দুইটি ভ্যারিয়েবল x থাকলে লোকাল স্কোপে x কে ব্যবহার করলে লোকাল স্কোপের x ই ব্যবহৃত হবে, গ্লোবাল x নয়।

আবারো বলি যে কার্লি বেস দিয়ে আলাদা করা প্রত্যেকটি এলাকার স্কোপই আলাদা। স্কোপ সমূহের দ্বায়ের ধারা অন্তর্মুখী। অর্থাৎ,  কোন স্কোপে ডিক্লেয়ার হওয়া ভ্যারিয়েবল কেবল সেই স্কোপ ও তার অভ্যন্তরীণ স্কোপ সমূহে ব্যবহৃত হতে পারবে। বাইরের কোন ফাংশন বা অপারেশন ই সরাসরি অভ্যন্তরীণ কোন স্কোপের কোন উপাদান এক্সেস, ব্যবহার বা পরিবর্তন করতে পারবে না।

গ্লোবাল স্কোপে ডিক্লেয়ার হওয়া ভ্যারিয়েবলকে গ্লোবাল ভ্যারিয়েবল বলে। যেমনঃ ফাংশন সমূহ সব সময়ই গ্লোবাল।

গ্লোবাল স্কোপে থাকা উপাদানসমূহ সবাই ব্যবহার করতে পারে, সবাই তাদের পরিবর্তন করতে পারে।

কোন ভ্যারিয়েবল ডিক্লেয়ার করার সময় তা মেমরিতে কিছু স্থান দখল করে। যতক্ষন তার স্কোপের কাজ শেষ না হয় ততক্ষন সে স্থান দখল করেই থাকে। স্কোপের কাজ শেষ হলেই সেটি বিলুপ্ত হয়ে যায়। একে "স্কোপের বাইরে চলে যাওয়া" (out of scope) বলে।

কাজেই গ্লোবাল কোন ভ্যারিয়েবল প্রোগ্রাম চলাকালীন পুরো সময়ই মেমরিতে তার স্থান দখল করে রাখে, আর লোকাল ভ্যারিয়েবলগুলো যতক্ষন স্কোপের মধ্যে থাকে ততক্ষন স্থান দখল করে থাকে আর স্কোপের বাইরে চলে গেলেই সেই মেমরি ফাকা হয়ে যায়।

কাজেই একজন দক্ষ প্রোগ্রামার সব সময়ই খেয়াল রাখে যে সে কোন স্কোপে কোন কাজ সম্পাদন করছে।

এবার একটি প্রশ্ন করি। নিচের কোড খেয়াল করেন,

#include<stdio.h>

int x=100;

int main()
{
    int x=50, y=10;

    if (x>10)
    {
        int y=50;
        printf("%d\n", x+y);
        x=10;
     }
     printf("%d", x+y);

return 0;
}

এই প্রোগ্রামের আউটপুট কি হবে? আমি জানি অনেকেই চিন্তা করা বাদ দিয়ে এটি রান করিয়ে দেখবেন। আচ্ছা বলেন দেখি, আউটপুট অমন কেন হলো???

0 comments:

Post a Comment