تفاوت بین Call by Value و Call by Reference چیست؟ آیا می توانید با استفاده از یک مثال این موضوع را توضیح دهید؟


پاسخ 1:

با تشکر از شما برای A2A.Call به این معنی که یک تابع با ایجاد یک نسخه از متغیر argument فراخوانی می شود. این بدان معنی است که پس از پایان کار ، مقدار اصلی تأثیر نمی یابد. Call by Reference به این معنی است که یک تابع با مشخص کردن مرجع (آدرس) متغیر فراخوانی می شود. این یعنی هر کاری که انجام می دهد با متغیری که نسبت به نسخه اصلی دارد انجام دهد.

کد C به شرح زیر است تا تفاوت را نشان دهد.

#inc call vby_by_value (int a، int b) {int temp = a؛ a = b؛ b = دما؛ printf ("هنگامی که برای مقدار a =٪ d و b =٪ d" ، a ، b) فراخوانی می شود؛ } void call_by_reference (int * a، int * b) {int temp = * a؛ * a = * b؛ * b = دما؛ printf ("وقتی توسط مرجع a =٪ d و b =٪ d" ، * a ، * b خوانده می شود)؛ main int main () int a = 10 ، b = 5؛ printf ("قبل از درخواست مقدار a =٪ d ، b =٪ d" ، a ، b)؛ call_by_value (a، b)؛ printf ("بعد از تماس با ارزش و قبل از تماس با مرجع a =٪ d ، b =٪ d" ، a ، b)؛ call_by_reference (& a ، & b)؛ printf ("پس از فراخوانی با مرجع a =٪ d ، b =٪ d" ، a ، b)؛ بازگشت 0؛ }

خروجی این تابع: -

قبل از تماس با مقدار a = 10 ، b = 5

هنگام فراخوانی برای مقدار a = 5 ، b = 10

پس از فراخوانی با ارزش و قبل از تماس با مرجع ، a = 10 ، b = 5

با مرجع a = 5 ، b = 10 فراخوانی می شود

بعد از تماس با مرجع a = 5 ، b = 10

پس از فراخوانی توسط مرجع ، متغیر اصلی در واقع رد و بدل شد ، اما بعد از تماس با مقادیر.


پاسخ 2:

تفاوت بین تماس با ارزش و تماس با مرجع.

پاسخ تمام این سؤالات را تکرار کنید که Call by Value مقادیر متغیرهای درگیر شده را می دهد و Call by Reference همان متغیرها یا اشاره گرها را به متغیرها منتقل می کند.

یک جواب نیز با استفاده از یک مثال در زندگی واقعی این موضوع را توضیح می دهد و من آن را دوست دارم. من می خواهم نیاز این روش ها را بیان کنم.

یک سناریو را تصور کنید. شما یک لیست ساده از مقادیر عددی دارید. داده ها به چند ستون و صدها ردیف تقسیم می شوند. حالا باید مبلغ کل یکی از ستون ها را محاسبه کنید. این ستون در یک آرایه یک بعدی ذخیره می شود. شما یک تابع برای محاسبه مبلغ دارید. تابع در اینجا باید آرایه را بخواند و مبلغ را به شما برگرداند.

در این حالت ، مقادیر واقعی نیازی به تغییر ندارند. نتیجه ساده و متغیر واحد است. در اینجا می توان اعداد را به عنوان لیستی از مقادیر منتقل کرد و تابع مبلغ (مقدار دیگری) را که استفاده از آن آسان است برمی گرداند. در سناریوی دوم ، یک ساختار پیچیده متشکل از یک سری مقادیر را تصور کنید که عملکرد یک موتور را تعریف می کند. توجه داشته باشید که چندین مقدار تعریف کننده وجود دارد و پارامترهای عملکرد نیز چند هستند.

شما داده ها را برای انواع مختلف موتور از دست داده اید و عملکردی دارید که پارامترهای عملکرد موتور را محاسبه می کند.

در این سناریو ، ورودی آرایه ای از داده های ساختاری است که یک نوع داده ساده نیست. خروجی نیز آسان نیست و حتی یک مقدار واحد نیز نیست.

در این حالت ، اگر ما یکسری ساختار از نظر ارزش را بگذرانیم و همان را بدست آوریم ، تغییر آن در نسخه اصلی ما پیچیده و غیر ضروری است.

اگر در عوض آدرس را در جایی ذخیره کنیم که این داده ها باشد (اشاره گر در c / مرجع در جاوا) ، این تابع می تواند ساختار اصلی را تغییر دهد و ما نیازی به بازگشت چیزی یا نگرانی در مورد ذخیره نتایج نداریم.

از این رو می توان از ارزش عبور استفاده کرد که داده ها نیازی به به روز رسانی نداشته باشند و از نظر ماهیتی ساده باشند.

در هنگام داده های پیچیده ، از مرجع استفاده می شود ، باید به روز شود و نتایج آسان نیست.


پاسخ 3:

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

تابع متغیر اصلی را هنگام نوشتن به متغیر ورودی عملکرد تغییر نمی دهد.

عبور از طریق مرجع به این معنی است که اساساً خود متغیر منتقل می شود (هرچند که نام می تواند تغییر کند)

اکنون که من یک توسعه دهنده PHP هستم ، یک مثال ساده در PHP برای شما می آورم

'؛ اولین نام اکو نام خانوادگی $ // John Doe Echo را چاپ می کند؛ echo getFullNameByReference (نام خانوادگی ، نام خانوادگی $)؛ // چاپ مداحی به نام خوب من ""؛ اولین نام اکو نام خانوادگی $ // چاپ نام خوب من

شما نمی توانید مقادیر را به عملکرد دوم منتقل کنید ، فقط می توانید متغیرها را به عملکرد دوم ارسال کنید.

در انتقال مرجع ، مقادیر تغییر کرده اند اگر مقادیر جدیدی را در این تابع به آنها اختصاص داده باشند. با وجود عملکرد قبلی ، متغیرهای مرجع یکسان هستند

توجه: توجه داشته باشید که نامهای متغیر در دو عملکرد متفاوت هستند ، اما دو متغیر اول تحت تأثیر مقدار جدید قرار می گیرند


پاسخ 4:

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

تابع متغیر اصلی را هنگام نوشتن به متغیر ورودی عملکرد تغییر نمی دهد.

عبور از طریق مرجع به این معنی است که اساساً خود متغیر منتقل می شود (هرچند که نام می تواند تغییر کند)

اکنون که من یک توسعه دهنده PHP هستم ، یک مثال ساده در PHP برای شما می آورم

'؛ اولین نام اکو نام خانوادگی $ // John Doe Echo را چاپ می کند؛ echo getFullNameByReference (نام خانوادگی ، نام خانوادگی $)؛ // چاپ مداحی به نام خوب من ""؛ اولین نام اکو نام خانوادگی $ // چاپ نام خوب من

شما نمی توانید مقادیر را به عملکرد دوم منتقل کنید ، فقط می توانید متغیرها را به عملکرد دوم ارسال کنید.

در انتقال مرجع ، مقادیر تغییر کرده اند اگر مقادیر جدیدی را در این تابع به آنها اختصاص داده باشند. با وجود عملکرد قبلی ، متغیرهای مرجع یکسان هستند

توجه: توجه داشته باشید که نامهای متغیر در دو عملکرد متفاوت هستند ، اما دو متغیر اول تحت تأثیر مقدار جدید قرار می گیرند