Learning ©➕➕
4.52K subscribers
81 photos
2 videos
38 files
182 links
ک
Download Telegram
#168
#storage_class #storage #class #auto #register #static #extern
✅کلاس های حافظه (Storage Class) در ++C

در زبان C (و ++C) قابلیتی به بنام کلاس های حافظه وجود دارد به نام های
🔹auto
🔹register
🔹static
🔹extern
استفاده هر یک از این کلاس ها برای کامپایلر مشخص میکنه که باید چطوری با متغییر ها رفتار بکنه

🔹استفاده از هر یک از کلاس های بالا برای متغییر ها دو ویژگی به هر متغییر اضافه میکند :
🔺محدوده استفاده از متغییر
🔺طول عمر متغییر

🔹محدوده استفاده از متغییر:
همانطور که از اسم محدوده مشخصه یعنی حد و مرز مثلا فرض کنید یک متغیری داریم که میخوایم فقط داخل یک تابع قابل شناسایی باشه تا دیگر توابع دسترسی به این متغییر نداشته باشد

🔹طول عمر متغییر:
منظور از طول عمر یک متغییر به این معنیه که ما (برنامه نویس) تعیین کنیم عمر متغییر چقدر باشه مثلا دوست داریم متغییر از اون زمانی که برنامه اجرا میشه ایجاد و تا زمانی که برنامه را به طور کامل نبسته ایم از بین نره یا نه میخوایم توی یک تابعی یک متغییر ایجاد بشه و نتیجه یک یکسری محاسبات رو داخل اون متغییر بریزیم سپس نتیجه رو توسط اون متغییر چاپ کنیم و پس از چاپ هم با خروج از اون تابع اون متغییر هم از بین بره

برای اینکه به کامپایلر دستور بدیم برای هر متغییری چه کلاسی را استفاه کند از الگوی زیر استفاده می کنیم
storage_class type var_name

مفهوم storage_class:
یعنی اینکه باید یکی از کلاس های حافظه در این قسمت قرار بگیره

مفهوم type:
در این قسمت باید یک نوع داده ای (telegram.me/Learncpp/91) استفاده کنیم

مفهوم var_name:
در این اینجا باید اسمی برای متغییر (telegram.me/Learncpp/107) انتخاب کنیم
@Learncpp
#183
#storage_class #storage #class #static
✅کلاس های حافظه (Storage Class) در ++C

🔹کلاس های حافظه استاتیک (static)
بعضی مواقع تو برنامه نیاز هست متغییری داشته باشیم که مقدارش را بعد از چندین بار فراخوانی حفظ کند تا از این مقدار در توابع دیگر استفاده کنیم مثلا فرض کنید یک تابعی به نام count دارید که می خواهید بدانید که این تابع چند بار داخل main فراخوانی خواهد شد, برای این کار باید به کامپایلر بفهمانیم که متغییری داخل تابع count تعریف کند که این متغییر بعد از هر فراخوانی تابع count مقدار قبلی خودش رو حفظ کند برای این که بتوانیم به یک متغییر توانایی حفظ مقدار قبلی را بدهیم نیاز به تعریف متغییر از نوع کلاس حافظه استاتیک هست

🔹نحوه تعریف متغییری از نوع استاتیک
static int score;

در کد بالا یک متغییری به نام score از کلاس حافظه static تعریف کرده ایم که با این نوع تعریف باعث می شود متغییر score قابلیت نگه داری مقدار قبلی خود را داشته باشد

⛔️ وقتی ما یه متغیری رو از نوع static تعریف میکنیم به صورت خودکار به متغییر یک مقدار اولیه صفر داده خواهد شد

🔹متغییر استاتیک را به دو صورت می توان تعریف کرد :
🔺متغییر استاتیک محلی
🔺متغییر استاتیک عمومی
@Learncpp
#184
#storage_class #storage #class #static
✅کلاس های حافظه (Storage Class) در ++C
🔹کلاس های حافظه استاتیک (static)

🔹متغییر استاتیک محلی

⛔️ منظور از متغییر استاتیک محلی یعنی اینکه فقط داخل تابعی که تعریف می شود قابل شناسایی هست و برای توابع دیگر ناشناخته هست

⛔️ محدوده متغییر استاتیک محلی فقط درون همان تابعی که تعریف شده شناخته می شود و در توابع دیگر قابل شناسایی نیست و طول عمر متغییر های استاتیک محلی هم از زمانی که main اجرا شده ایجاد و تا زمانی که کامپایلر به return 0 رسید از بین می روند

⛔️ متغییر استاتیک محلی برای اولین باری که تابع فراخوانی می شود ایجاد می شوند و تنها یکبار مقدار دهی اولیه می شوند همچنین هنگام خروج از تابع آخرین مقدارشان را حفظ می کنند این یعنی اینکه برای بار دوم که تابع فراخوانی شد دستوری که باعث تعریف متغییر استاتیک محلی می شود از طرف کامپایلر نادیده گرفته خواهد شد تا مقدار قبلی متغییر استاتیک محلی حفظ شود

برای درک بهتر تذکرات بالا به مثال (telegram.me/Learncpp/504) توجه کنید
@Learncpp
#185
#storage_class #storage #class #static
✅کلاس های حافظه (Storage Class) در ++C
🔹کلاس های حافظه استاتیک (static)

🔹متغییر استاتیک محلی

مثال) برنامه ای بنویسید که امتیاز یک بازیکن را پس از چندین بار فراخوانی داخل یک متغییر حفظ کند (هدف نحوه استفاده متغییر استاتیک محلی هست)
#include <iostream>

using namespace std;


void print_score()

{

static int score;

score++;

cout<<"value variable num is : "<<score<<endl;

}


int main()

{

print_score(); //cout 1

print_score(); //cout 2

print_score(); //cout 3

print_score(); //cout 4

print_score(); //cout 5

return 0;

}

در تابع print_score متغییری به اسم score از نوع کلاس static تعریف کرده ایم که بار اولی که print_score داخل main صدا زده می شود کامپایلر تابع print_score را اجرا و متغییر score را ایجاد و یک مقدار به آن اضافه کرده و آن را چاپ می کند, برای بار دومی که کامپایلر تابع print_score را اجرا می کند اینبار دستور static int score از طرف کامپایلر نادیده گرفته خواهد شد و اجرا نمی شود تا مقداری که از قبل داخل متغییر score هست از بین نرود
@Learncpp
#186
#storage_class #storage #class #static
✅کلاس های حافظه (Storage Class) در ++C
🔹کلاس های حافظه استاتیک (static)

🔹متغییر استاتیک عمومی

طرز کار متغییر استاتیک عمومی همانند متغییر استاتیک محلی است ولی با این تفاوت که متغییری که از نوع عمومی تعریف می شود در همه جا قابل شناسایی هست ولی متغییری که از نوع استاتیک محلی تعریف می شود فقط داخل تابعی که تعریف می شود شناخته شده است

⛔️ طول عمر متغییر استاتیک عمومی همانند متغییر سراسری ( متغییری که بالای main نوشته می شود) هست

مثال) برنامه ای که نحوه استفاده از متغییر استاتیک عمومی را نمایش می دهد
#include <iostream>

using namespace std;


static int score;


void test()

{

score++;

}


int main()

{

test();

cout<<score<<endl;//cout 1

test();

cout<<score<<endl;//cout 2

test();

cout<<score<<endl;//cout 3

return 0;

}

همانطور که در کد بالا دیدید کد static int score بالای main نوشته شده که این کار باعث شده هم مقدار صفر به صورت پیش فرض درون متغییر قرار بگیرد و هم متغییر score در تمامیه توابع دیگر قابل شناسایی باشد
@Learncpp
#187
#storage_class #storage #class #static
✅کلاس های حافظه (Storage Class) در ++C
🔹کلاس های حافظه استاتیک (static)

🔺متغییر استاتیک محلی
🔺متغییر استاتیک عمومی

⛔️ چه تفاوتی بین متغییر سراسری با متغییر استاتیک عمومی هست؟

متغییری که به صورت سراسری تعریف می شود با متغییری که از نوع کلاس استاتیک عمومی تعریف می شود هیچ تفاوتی ندارند به شرطی که در یک فایل باشند ولی گاهی لازمه که برنامه ای که می نویسید دارای چندین فایل باشد اینجاست که تفاوتی ایجاد می شود و آن هم این است که متغییری که به صورت سراسری تعریف می شود می توان در فایل های دیگر با استفاده از کلاس حافظه خارجی (telegram.me/Learncpp/507) از آن استفاده کرد ولی متغییری که از نوع کلاس حافظه استاتیک عمومی تعریف می شود فقط در همان فایلی که قرار دارد قابل دسترسی و شناسایی هست
@Learncpp