PDA

View Full Version : سوال: ایا این متغیر واقعا ایستا است؟



motherboard
سه شنبه 28 مرداد 1393, 16:34 عصر
سلام.در کد زیر مگر count و i به صورت ایستا نیستند.پس این تغییر و تحولاتی که توسط ++ و یا -- براشون پیش میاد چیه؟یک مقدار مرز بین ایستا و ثابت ها رو قاطی کردم.:گیج:

#include <iostream>

// Function declaration
void func(void);

static int count = 10; /* Global variable */

main()
{
while(count--)
{
func();
}
return 0;
}
// Function definition
void func( void )
{
static int i = 5; // local static variable
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}

parvizwpf
سه شنبه 28 مرداد 1393, 17:06 عصر
منظورت ار ++ -- چیه؟ یعنی چی قاطی میکنم؟

motherboard
سه شنبه 28 مرداد 1393, 17:14 عصر
منظورت ار ++ -- چیه؟ یعنی چی قاطی میکنم؟
اون طور که از اسم حافظه ایستا برمیاد یعنی ایستا!!! از یک طرف هم با const میشه یک متغیری رو ساخت که باید همیشه یک مقدار رو تو خودش داشته باشه.مثل مثل ثابتی مثل 3.14. می خوام بدونم یک حافظه ایستا از چه نظر ایستا است؟ ایا از نظر ادرس حافظه و یا از نظر محتویاتی که داخل خودش داره؟

parvizwpf
سه شنبه 28 مرداد 1393, 17:20 عصر
اگه const رو میگی از هر دو نظر .

motherboard
سه شنبه 28 مرداد 1393, 18:27 عصر
اگه const رو میگی از هر دو نظر .
پس اگه بخواهیم جمع بندی کنیم یک متغیر استاتیکی تنها از نظر ادرس حافظه ثابت است ولی محتویاتش می تونه تغییر بکنه.اما در const هم محتویاتش ثابت هست و هم ادرس حافظه.اگر نتیجه گیریم درست بود.یک اره و یا خیر بفرست.ممنون.

a.r.khoshghalb
سه شنبه 28 مرداد 1393, 19:22 عصر
هیچ کدوم از این دو توضیح، مناسب سوال شما نیستند.
وقتی متغیری را به صورت static تعریف می کنیم، هر چه قدر دیگر متغیر را تعریف کنیم فرقی نمی کند، فقط همان یک بار تعریف می شود.
برای مثال خروجی برنامه زیر 3 است. نه ارور می دهد نه خروجی 1 می شود :

#include <iostream>
using namespace std;
void plusplus()
{
static int a;
a++;
}

void print ()
{
static int a;
cout << a << endl;
}

int main()
{
plusplus();
plusplus();
plusplus();
print();
}


کاربرد:
یکی از کاربردهایش داشتن متغیر ثابت بین تمام شی هایی از یک جنس است.
فرض کن می خوای تمام ورودی های مدارس امسال رو دسته بندی کنی .
یک کلاس دانش آموز داری، ازش به اندازه دانش آموزانی که امسال میرن اول دبستان ساختی. سن همه این دانش آموز ها یکیه.
پس شما میای تو کلاس دانش آموزت یک متغیر سن به این صورت تعریف می کنی :

class DaneshAmuz{
static int sen;
...
}

الان تمام دانش آموزایی که ساختی یک سن دارند و اگر سن یکیشون رو عوض کنی، سن همشون عوض میشه.

مثال های زیاد دیگه هست که خودت به مرور زمان میبینی...

rahnema1
سه شنبه 28 مرداد 1393, 19:32 عصر
استاتیک: مدت طول عمر متغیر از ابتدا تا انتهای برنامه هست به خاطر همین ایستا هست ( یعنی طول عمرش ایستا هست) از یک جهت دیگه هم ایستا هست که حافظه اختصاص داده شده به متغیر در فایل exe ذخیره میشه
اتوماتیک : متغیرهایی که داخل بلاک ( مثل محدوده یک تابع) تعریف می شوند حافظه ای که قراره در اختیار متغیر قرار بگیره به صورت اتوماتیک انجام میشه با خروج از تابع به صورت اتوماتیک متغیرها از بین می روند و حافظه اون متغیرها ازشون گرفته میشه
دینامیک : به صورت دستی به یک متغیر حافظه را اختصاص داده و از آن می گیریم با استفاده از عملگری مثل new و delete

omid_kma
چهارشنبه 29 مرداد 1393, 19:37 عصر
استاتیک: مدت طول عمر متغیر از ابتدا تا انتهای برنامه هست به خاطر همین ایستا هست ( یعنی طول عمرش ایستا هست) از یک جهت دیگه هم ایستا هست که حافظه اختصاص داده شده به متغیر در فایل exe ذخیره میشه

این جمله بیشتر در مورد مفهوم static memory هست و شاید زیاد مناسب این تاپیک که درباره static variable هست نباشه ؟
مثلا متغیر static ای که داخل تابع باشه این تعریف براش درست نیست .(هم قسمت اختصاص حافظه داخل فایل exe و هم قسمت اول )
فکر می کنم که این تعریف برای این سوال مناسب تر باشه :
متغیر استاتیک : متغیری که زمان رسیدن اجرای برنامه به تعریفش فقط یکبار ساخته میشود و طول عمرش تا آخر برنامست .

rahnema1
چهارشنبه 29 مرداد 1393, 21:49 عصر
این جمله بیشتر در مورد مفهوم static memory هست و شاید زیاد مناسب این تاپیک که درباره static variable هست نباشه ؟
مثلا متغیر static ای که داخل تابع باشه این تعریف براش درست نیست .(هم قسمت اختصاص حافظه داخل فایل exe و هم قسمت اول )
فکر می کنم که این تعریف برای این سوال مناسب تر باشه :
متغیر استاتیک : متغیری که زمان رسیدن اجرای برنامه به تعریفش فقط یکبار ساخته میشود و طول عمرش تا آخر برنامست .

فکر کنم مشکل پرسنده سوال یه مشکل لفظی بود می خواست بدونه چرا مثلا به متغیر میگن استاتیک یا ایستا ( می خواست فلسفه نامگذاری اون را بدونه)

omid_kma
چهارشنبه 29 مرداد 1393, 22:55 عصر
فکر کنم مشکل پرسنده سوال یه مشکل لفظی بود می خواست بدونه چرا مثلا به متغیر میگن استاتیک یا ایستا ( می خواست فلسفه نامگذاری اون را بدونه)
من برای این گفتم چون پست بالای شما در مورد متغیر static داخل تابع بود بعد پست بعدی اینه که استاتیک یعنی از اول تا آخر برنامه خب طبیعتا یک نفر که میخواد این بحث رو بخونه ممکنه بد برداشت کنه .