تالار گفتمان مانشت

نسخه‌ی کامل: سوال مفهومی : تفاوت فراخواتی با نام؛مقدار؛نتیجه و ...
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام دوستان
من نمیتونم تفاوت فراخواتی با نام؛مقدار؛نتیجه و ... را بفهمم
جندبار هم این سوال پرسیده شده اما کسی جواب نداده
اکه ممکنه با مثال توضیح بدید
ممنون
فراخوانی یک تابع با مقدار همان فراخوانی عادی هست که توی همه‌ی زبان های برنامه سازی مینویسیم (پارامتر های مجازی در پارامتر های واقعی کپی می شوند)
فراخوانی با ارجاع در واقع در واق به جای خود متغیر‌ها آدرس متغیر‌ها رو به صورت آرگومان به تابع میفرستیم( چون آدرس رو میفرستیم هر تغییری که روی متغیر های واقعی اعمال بشه روی متغیر های مجازی یعنی همون هایی که به عنوان پارامتر ارسال کردیم هم اعمال میشه)
فراخوانی با مقدار-نتیجه در عمل و از دید برنامه نویس مثل فراخوانی با ارجاع هست با این تفاوت که در موقع ورود به تابع اول پارامتر های مجازی رو روی پارامتر های واقعی کپی میکنه و بعد از تغییرات رو پارامتر های واقعی موقع خروج از تابع اون هارو مجدداً روی پارامتر های مجازی کپی میکنه.
خیلی ممنون از توضیحات خوبتون
حالا میشه بر اساس توضیحاتتون این تست را حل کنید؟ ممنون
اول call by value
تابع xyz دوبار پارامتر k رو با مقدار 100 دریافت میکنه وارد تابع میشه شرط if برقرار نیست پس از تابع میاد بیرون و مقدار k که همون 100 هست رو چاپ میکنه.

call by reference
توی این نوع فراخوانی اول تابع با مقدار متغییر k که همون 100 هست فراخوانی میشه ولی چون آدرس متغیر ارسال میشه‌، هر تغییری توی تابع( روی پارامتر مجازی) باعث تغییر مقدارk (پارامتر واقعی) میشه. بنابر این مقدار k توی تابع به وسیله دستور i=300 تبدیل به 300 میشه ... بنابر این مقدار پارامتر های مجازی i و j برابر هم میشه و شرط ارضاع میشه بنابر این مقدرا j برابر با 300 * 2 + 300 میشه (درواقع چون J هم به k اشاره میکنه این تغییر باعث تغییر مقدار k یا همون پارامتر واقعی میشه) پس تا اینجا مقدار J و به دنبال اون مقدار k برابر با 900 میشه

call by value result
توی این فراخوانی وقتی تابع xyz فراخوانی میشه مقدار که k قبل از فراخوانی 100 هست توی متغیر های i , j کپی میشه پس تا اینجا i و j هر دو مقدار 100 دارند. بعد توی تابع مقدار i تغییر میکنه و تبدیل به 300 میشه بعد شرط i=j چک میشه چون i=300 و j=100 اون خط جلوی If اجرا نمیشه و تابع تموم میشه.. موقع خروج از تابع پارامتر های مجازی (i,j) توی پارامتر های واقعی (k) به ترتیب کپی میشند. یعنی اول 300 کپی میشه و بعد 100 .... پس آخرین مقدار k برابر با 100 میشه و چاپ میشه

گزینه 4 درسته...! Smile
(22 بهمن 1390 06:30 ب.ظ)vijay نوشته شده توسط: [ -> ]call by nameچه شکلی به دست میاد؟؟؟؟
یعنی همیشه باcall by refrence یکی میشه؟؟؟!!!

هیچ وقت نمیتونیم بگیم این با اون یکی میشه اگرچه ممکنه خیلی با هم اشتراک داشته باشند ولی این قاعدده کلی نیست که بگیم با نام و با ارجاع همیشه یکی میشه

فراخوانی با نام به این صورته که توی زیر برنامه به محض رجوع به پارامتر مجازی مقدارش از پارامتر واقعی ارزیابی میشه. و باز یه محض تغییر روی پارامتر مجازی مقدارش روی پارامتر واقعی کپی میشه.

توی بعضی از تست‌ها دیدم که مقدار فراخوانی با نام و با ارجاع لزوما نتیجه یکسانی نمیدن.!
اگه اشتباه نکنم توی کتاب آقای مقسمی دیدم نوشته بود که اگه پارامتر (متغیر)مون ساده باشه اونوقت ارجاع و نام یک نتیجه می دهند. اما اگه مثلا پارامتر ما بصورت آرایه ای باشه اونوقت لزوما این دو تا نتیجه یکسانی نمی دهند.
و به نظر من هم درست گفته.

بازم خودتون تحقیق بفرمایید ...
در کتاب پرات نوشته در صورتیکه از متغیر های ساده ای مثل int, ... استفاده کنیم فراخوانی با نام همانند فراخوانی با ارجاع می شود.
(25 بهمن 1390 07:13 ب.ظ)پشتکار نوشته شده توسط: [ -> ]در کتاب پرات نوشته در صورتیکه از متغیر های ساده ای مثل int, ... استفاده کنیم فراخوانی با نام همانند فراخوانی با ارجاع می شود.

درسته هروقت که متغیر ساده باشه و یا عضو معین و مشخصی از یک آرایه باشد فراخوانی با نام و ارجاع نتایج یکسانی دارند اما اگر عضو نامعینی از آرایه باشد متفاوتند.
عضو معین مثل:B[5]5 و نامعین مثل:[B[I

(30 دى 1390 11:27 ب.ظ)zahra412 نوشته شده توسط: [ -> ]خیلی ممنون از توضیحات خوبتون
حالا میشه بر اساس توضیحاتتون این تست را حل کنید؟ ممنون

سلام جواب گزینه 4
تو این سوال i,jپارامترهای مجازی و kپارامتر واقعی
1)فراخوانی با مقدار:مقدار پارامتر واقعی K که 100 میباشد در پارامترهای مجازی i,j کپی میشود و هرگونه تغییری روی پارامترهای مجازی تاثیری در پارامتر واقعی نمیگذارد پس در انتها همان مقدار واقعی 100 چاپ میشود.
2)فراخوانی بامقدار-نتیجه: اولش مثل روش با مقدرا ر ، مقدار K در i,j کپی میشه بعد میبینیم که i مقدار 300 میگیره اما چون در شرط if ، متغیرهای i,j برابر نیستن پس شرط اجرا نمیشه .اما در این روش در انتها مقادیر پارامتر مجازی در واقعی کپی میشوندو ودر(k,k) write مدار i در k اول , مقدار j در k دوم کپی میشود و مقدار نهایی یعنی k دوم: 100.
3)فراخوانی با ارجاع:آدرس پارامتر واقعی به پارامتر مجازی ارسال شده و هر تغییری روی پارامتر مجازی ،پارامتر واقعی را هم تغییر میدهدو
در اینجا ابتدا آدرس K به i,j ارسال میشود یعنی هر دو به یک آدرس اشاره میکنند پس در شرط if برقرار است و با اجرای حلقه j مقدار 900 میگیرد.
4)فراخوانی بانام:نام پارامتر واقعی kدر پارامترهای مجازی i,j کپی میشود و با هر تغییر پارامتر مجازی باید پارامتر واقعی هم ارزیابی شود.پس در اینجا وقتی i=300 یعنی k=300و باز یعنی j=300 پس شرط برقرار است و جواب=900
لینک مرجع