PDA

View Full Version : فرق تعریف ثابت ها بصورت const و define#



mr_esmaily
پنج شنبه 09 تیر 1384, 17:38 عصر
سلام
متوجه شدم که ثابت ها رو با کلمه کلیدی const بعنوان یک متغییر خصوصی در یک کلاس نمی شه تعریف کرد ولی با استفاده از define# میشه.
می خواستم از تفاوت های دیگرشان مطلع شم.

با تشکر.

navid_R
پنج شنبه 09 تیر 1384, 19:50 عصر
یکی از تفاوت هایی که من می دونم اینه که متغییر هایی که با define تعریف می شوند هیچ حجمی اشغال نمی کنند.

مهدی
پنج شنبه 09 تیر 1384, 20:02 عصر
اصولا اگر راجع به شباهتشون حرف بزنیم خلاصه تر میشه !
با define عملا متغیری تعریف نمیشه! فقط یه جایگزاری ساده قبل از کامپایل برنامه انجام میشه! اما با const واقعا یه متغیر تعریف میکنی.
مثلا این کد رو نگاه کن تا بفهمی چی میگم.

#define n 10+2
...
cout<<(n*2);
خوب حالا فکر میکنی خروجی چیه؟ عملا قبل از کامپایل n با 10+2 جایگزین میشه و بعدش حاصل 14 چاپ میشه نه 24!
:موفق:

mr_esmaily
پنج شنبه 09 تیر 1384, 23:12 عصر
سلام
مرسی جالب بود.
ولی چرا 14 چاپ میشه ؟
منظورم اینه که اگه n=10 اونوقت 20 چاپ میشه!
منطقشو نفهمیدم؟!

مهدی
پنج شنبه 09 تیر 1384, 23:37 عصر
همونطور که گفتم define یه جانشینی ساده است. پس عبارت
cout<<(n*2);
تبدیل میشه به
cout<<(10+2*2);

mr_esmaily
جمعه 10 تیر 1384, 00:08 صبح
سلام
ممنون :flower:

مهدی
جمعه 10 تیر 1384, 11:27 صبح
خواهش! :oops:

محمد میرمصطفی
جمعه 10 تیر 1384, 23:00 عصر
فرق تعریف ثابت ها بصورت const و define#
define برای ایجاد ماکرو استفاده میشه. یعنی مجموعه ای از دستورات که جایگزین فقط یک فرمان می شه یعنی در زمان کامپایل متن موجود در تعریف ماکرو عینا در محل نامیدن ماکرو قرارداده میشه. بعد کامپایل میشه.
ولی چرا 14 چاپ میشه ؟
خیلی ساده‏ست. تقدم عملیاتی ضرب قبل از جمع است. یعنی:

10+2*2 => 10 + ( 2 * 2 ) => 10 + ( 4 ) => 14

mr_esmaily
جمعه 10 تیر 1384, 23:48 عصر
سلام

خیلی ساده‏ست. تقدم عملیاتی ضرب قبل از جمع است. یعنی:


10+2*2 => 10 + ( 2 * 2 ) => 10 + ( 4 ) => 14
مشکله من این بود که چرا 2*(2+10) نشد ; که متوجه موضوع شدم.

مهدی
شنبه 11 تیر 1384, 08:11 صبح
mr_esmaily عزیز
دوستان بعضا بعلت عجله در جواب دادن متن کامل موضوع رو نمیخونند و علت اینم که بعضی مطالب چند باره تکرار میشن همینه :sunglass: