PDA

View Full Version : مبتدی: تفاوت دو دستور در c



fereshte joon
دوشنبه 20 مهر 1388, 11:50 صبح
سلام من اين سوال رو قبلا يه بخش نامربوط گذاشته بودم كه معذرت ميخوام

اين دو تا دستورو ببينين
const int max=30

#define max 30

نحوه برخورد كامپايلر با هركدوم از اين دو تا دستور چطوريه؟ چه تفاوتي با هم دارن؟

حامد مصافی
دوشنبه 20 مهر 1388, 12:28 عصر
در حالت اول : بخشی از حافطه را که امکان تغییر ندارد تصاحب کرده و مقدار 30 را در آن درج می کند
در حالت دوم : پیش از کامپایل توکن های max را به 30 تغییر می دهد.

fereshte joon
سه شنبه 21 مهر 1388, 22:22 عصر
مثل اينكه من خيلي مبتدي ام:ناراحت:
ميشه بم بگيد پيش از كامپايل يعني چه مرحله اي؟ اين 30 كي به max باندميشه؟(باند يا هموني كه تو ترجمه هاي جعفرنژاد نوشته انقياد اين انقياد قبل از كامپايل يعني كي؟)

Nima_NF
چهارشنبه 22 مهر 1388, 17:06 عصر
پیش پردازنده ها یعنی در هنگام کامپایل وضعیت آن ها باید مشخص باشند. این طوری آن قسمت به شکل یک قطعه کد در فایل اجرایی قرار می گیرد و مانند موارد دیگر در زمان اجرا حافظه نمی گیرند. این طوری هر جایی از کل برنامه که از آن ها استفاده می کنند توسط کامپایلر در هنگام کامپایل جایگزین می شوند و یا حال به نحوی به آن قسمت لینک داده می شوند.

sepehrst
جمعه 24 مهر 1388, 06:13 صبح
این 2 قطعه کد را در نظر بکیرید:

کد اول:



const int max = 30;
int a;
a = max - 1;


کد دوم:



#define max 30
int a;
a = max - 1;



کد اول:
در این کد یک محل از حافظه بطول 4 بایت(1*) جهت نگهداری مقدار متغیر max در برنامه تخصیص پیدا میکنه. هر بار که شما برنامه خود رو اجرا میکنید، اول مقدار متغیر max که 30 هست خونده میشه و سپس مقدار max - 1 محاسبه میشه و بعد، نتیجه که 29 هست، در متغیر a ذخیره میشه. یعنی در زمان اجرای برنامه(RunTime) مقدار max - 1 محاسبه میشه.


کد دوم:
در این کد هیچ مکانی از حافظه جهت ذخیره max تخصیص پیدا نمیکنه، در واقع max اصلا یک متغیر در نظر گرفته نمیشه. کامپایلر قبل از کامپایل کردن سورس، تمام مکانهایی که شناسه max آورده شده رو با عدد 30 جایگزین میکنه. و مقدار max - 1 تنها یکبار، اونهم در زمان کامپایل برنامه محاسبه میشه و در برنامه نهایی قرار داده میشه.
یعنی سورس شما قبل تولید فایل اجرایی نهایی به این شکل درمیاد:



a = 29;


(1*):
طول متغیر از نوع int، در سیستمهای 32 بیتی مانند ویندوز 4 بایت هست و در سیستمهای 16 بیتی مثل داس، عموما 2 بایت در نظر گرفته میشه. البته این موضوع در مورد سیستمهای 16 بیتی مثل داس، به نسخه و نگارش کامپایلر هم بستگی داره.