چرا این تغییر متغییرهای داخل تابع ،باعث تغییر متغییر main میشه؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چرا این تغییر متغییرهای داخل تابع ،باعث تغییر متغییر main میشه؟

+1 امتیاز

چرا این تغییر متغییرهای داخل تابع ،باعث تغییر متغییر main میشه؟

هرجور فکر میکنم جور در نمیآد، آخه وقتی که داخل main تابع swap فراخانی میشه و مقادیر رو به تابع میفرسته ، ورودی آرگومان تابع چه اتفاقی میاوفته که باعث تغییر متغییر داخل مین میشه؟

#include "stdafx.h"
#include <iostream>
using namespace std;
void swap ( int &a , int &b)
{
	int temp = a ;
	a = b;
	b = temp;
}

int main()
{
	int x , y ;
	x = 8;
	y= 5;	
	swap (x, y);
	cout << x << y <<endl;
	system("pause");
}

با تشکر.

 

سوال شده مهر 2, 1393  بوسیله ی hosseinam1370 (امتیاز 163)   8 22 34
دوباره تگ گذاری شد مهر 2, 1393 بوسیله ی BlueBlade
ممنون...

2 پاسخ

+3 امتیاز
 
بهترین پاسخ
سلام!

علتش این هست که تابعتون آرگومان ها رو آدرسشون رو می گیره نه مقدارشون رو... به اصطلاح Call by Reference کردید نه Call by Value...

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

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

علت این اتفاق استفاده از & پشت نام متغیرهای ورودی تابعتون بود...

برای مطالعه ی بیش تر:

http://www.c4learn.com/c-programming/c-function-parameter-passing

http://www.codingunit.com/c-tutorial-call-by-value-or-call-by-reference
پاسخ داده شده مهر 2, 1393 بوسیله ی مسعود لپه‌چی (امتیاز 928)   11 31 50
انتخاب شد مهر 3, 1393 بوسیله ی hosseinam1370
+3 امتیاز
سلام. اگر شما در آرگومان های تابع از & استفاده کنی یعنی خود متغیر رو به تابع می فرسته و هر تغییری روی متغیر صورت بگیره در تابع main هم اعمال میشه. اما اگه & رو در آرگومان های تابع نذاری کپی از متغیر ارسال میشه و در تابع هر تغییری اعمال شود پس از اینکه تابع خاتمه بافت مقدار متغیر ارسال شده در main تغییری نخواهد کرد. الان اکه & رو قبل از a و b برداری و برنامه اجرا کنی مقدار x و y عوض نخواهد شد
پاسخ داده شده مهر 2, 1393 بوسیله ی Pashmak (امتیاز 644)   8 15 31
...