خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش زبان ++C : مروری بر پارامترهای توابع و آرگومان ها (function parameters and arguments)

آموزش زبان ++C : مروری بر پارامترهای توابع و آرگومان ها (function parameters and arguments)
نویسنده : امیر انصاری
در درس قبلی، دانستید که یک تابع (function) می تواند به تابع فراخوانی کننده آن (caller) مقداری را باز گرداند.

سیستم یکپارچۀ سازمانی راهکار



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

یک پارامتر تابع یک متغیر می باشد که در یک تابع (function) استفاده می شود، مقدار این متغیر توسط تابع فراخوانی کننده آن (caller) فراهم می شود. پارامترهای توابع در بین پرانتزهایی که در هنگام معرفی تابع قرار داده میشوند، جای می گیرند. اگر یک تابع دارای بیش از یک پارامتر باشد، این پارامترها با کاما (,) از یکدیگر جدا می شوند.

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

// This function takes no parameters
// It does not rely on the caller for anything
void doPrint()
{
std::cout << "In doPrint()" << std::endl;
}

// This function takes one integer parameter named x
// The caller will supply the value of x
void printValue(int x)
{
std::cout << x << std::endl;
}

// This function has two integer parameters, one named x, and one named y
// The caller will supply the value of both x and y
int add(int x, int y)
{
return x + y;
}

هر پارامتر تابع فقط در داخل آن تابع معتبر می باشد. بنابراین در مثال هایی که زدیم توابع printValue و add هر دو پارامتری با نام x دارند، این پارامترها از یکدیگر جدا در نظر گرفته می شوند و با هم تداخل پیدا نخواهند کرد، چرا که هر کدام در تابع خودش معتبر شناخته می شود.

یک آرگومان (argument) مقداری است که از طرف تابع فراخوانی کننده (caller) به یک تابع فراخوانی شوند ارسال می گردد :

printValue(6); // 6 is the argument passed to function printValue()
add(2, 3); // 2 and 3 are the arguments passed to function add()

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

پارامترها و آرگومان ها چگونه با یکدیگر کار می کنند؟


وقتی که یک تابع فراخوانی می شود، تمامی پارامترهای آن تابع به عنوان یک متغیر در ابتدای تابع معرفی می گردند، و مقدار ارسالی توسط آرگومان ها به عنوان مقدار آن متغیرها می نشیند. در واقع آرگومان ها به ترتیب در پارامتر متناظرشان کپی می شوند. این رویه "ارسال با مقدار" (pass by value) نامیده می شود.

به عنوان مثال :

#include "iostream"

// This function has two integer parameters, one named x, and one named y
// The values of x and y are passed in by the caller
void printValues(int x, int y)
{
std::cout << x << std::endl;
std::cout << y << std::endl;
}

int main()
{
printValues(6, 7); //This function call has two arguments, 6 and 7

std::cin.get();
return 0;
}

وقتی تابع printValues با آرگومان های 6 و 7 فراخوانی می شود، پارامترهای تابع printValues به ترتیب با مقادیر 6 و 7 مقدار دهی می شوند.

خروجی این برنامه به شکل زیر خواهد بود :

6
7

چگونه پارامترها و مقادیر بازگشتی با یکدیگر کار می کنند؟


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

در اینجا یک مثال از یک تابع ساده زده ایم که دو عدد را به عنوان پارامتر ورودی دریافت می کند و مجموع آن دو عدد را به عنوان مقدار بازگشتی به تابع فراخوانی کننده (caller) باز می گرداند :

#include "iostream"

// add() takes two integers as parameters, and returns the result of their sum
// The values of x and y are determined by the function that calls add()
int add(int x, int y)
{
return x + y;
}

// main takes no parameters
int main()
{
std::cout << add(4, 5) << std::endl; // Arguments 4 and 5 are passed to function add()

std::cin.get();
return 0;
}

وقتی تابع add فراخوانی می شود، مقدار 4 به پارامتر x منتسب می شود، و مقدار 5 به پارامتر y منتسب می گردد.

سپس تابع add جمع مقادیر x و y را محاسبه می کند و عدد 9 را برمیگرداند، عدد 9 به عنوان مقدار بازگشتی تابع add به تابع فراخوانی کننده (caller) که در اینجا main می باشد، باز گردانده می شود. سپس در تابع main مقدار 9 به شیء cout ارسال می شود که در نتیجه در صفحه نمایش چاپ خواهد شد.

خروجی این برنامه به شکل زیر می باشد :

9

در قالب تصویر :

آموزش زبان ++C : مروری بر پارامترهای توابع و آرگومان ها (function parameters and arguments)

مثالهای بیشتر :


بیایید نگاهی به چند فراخوانی تابع بیندازیم :

#include "iostream"

int add(int x, int y)
{
return x + y;
}

int multiply(int z, int w)
{
return z * w;
}

int main()
{
std::cout << add(4,5) << std::endl; // within add(), x=4, y=5, so x+y=9
std::cout << multiply(2, 3) << std::endl; // within multiply(), z=2, w=3, so z*w=6

// We can pass the value of expressions
std::cout << add(1+2, 3*4) << std::endl; // within add(), x=3, y=12, so x+y=15

// We can pass the value of variables
int a = 5;
std::cout << add(a, a) << std::endl; // evaluates (5 + 5)

std::cout << add(1, multiply(2,3)) << std::endl; // evaluates 1 + (2 * 3)
std::cout << add(1, add(2, 3)) << std::endl; // evaluates 1 + (2 + 3)

std::cin.get();
return 0;
}

این برنامه خروجی زیر را تولید خواهد کرد :

9
6
15
10
7
6

دو بیانیه (statement) اول سرراست و ساده هستند.

در بیانیه سوم پارامترها عباراتی هستند که ابتدا ارزیابی می شوند و سپس نتیجه این ارزیابی به تابع مربوطه پاس می شود. در این مثال 2 + 1 به 3 ارزیابی می شود، و در نتیجه 3 به پارامتر x پاس می شود. 4 * 3 به 12 ارزیابی می شود، و سپس مقدار 12 به پارامتر y پاس می شود. در نتیجه add(3, 12)=15 خروجی 15 را منجر خواهد شد.

دو بیانیه (statement) بعدی نیز به همان نسبت آسان می باشند :

    int a = 5;
std::cout << add(a, a) << std::endl; // evaluates (5 + 5)

در این مورد، تابع add به این شکل فراخوانی می شود که x = a و y = a می باشد. از آنجا که a = 5 می باشد، در نتیجه add(a, a) = add(5, 5) = 10 .

بیایید نگاهی به اولین بیانیه ماهرانه این مثال بیندازیم :

std::cout << add(1, multiply(2, 3)) << std::endl; // evaluates 1 + (2 * 3)

وقتی تابع add اجرا می شود، پردازنده (CPU) نیاز دارد تا بداند چه مقادیری برای پارامترهای x و y فراهم شده است. مقدار پارامتر x ساده است، چرا که ما مقدار 1 را به آن پاس کرده ایم و در نتیجه x=1 می باشد. برای اینکه مقدار y تعیین شود، ابتدا نیاز می باشد تا عبارت

multiply(2, 3)

ارزیابی گردد. پردازنده (CPU) مقدار 2 را به پارامتر z منتسب می کند و همینطور مقدار 3 را به پارامتر w منتسب می کند. در نتیجه :

multiply(2, 3) = 6

حالا مقدار 6 که بازگشتی تابع multiply می باشد به متغیر y در تابع add منتسب می شود. در نهایت خواهیم داشت :

add(1, 6) = 7

مقدار 7 هم به شیء cout پاس داده می شود و روی صفحه چاپ می گردد.

به طور خلاصه خواهیم داشت :

add(1, multiply(2, 3)) => add(1, 6) => 7


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

std::cout << add(1, add(2, 3)) << std::endl; // evaluates 1 + (2 + 3)

این مورد نیز دقیقاً مشابه بیانیه قبلی عمل خواهد کرد، در هر دو مورد یکی از پارامترها توسط فراخوانی یک تابع دیگر مقدار دهی شده اند. در مورد قبلی تابع multiply و در این مورد تابع add به عنوان پارامتر ارسال گردیده اند.

پردازنده (CPU) قبل از اینکه تابع add را اجرا کند، ابتدا فراخوانی های درونی را اجرا می کند، نتیجه آنها را ارزیابی می کند و سپس نتایج را به عنوان پارامتر به تابع add بیرونی، ارسال خواهد کرد.

add(1, add(2, 3)) => add(1, 5) => 6


نتیجه


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

مقادیر بازگشتی (Return values) به یک تابع امکان می دهند تا مقداری را به تابع فراخوانی کننده (caller) باز گردانند.


آموزش قبلی : آموزش زبان ++C : مروری بر توابع و مقدار بازگشتی توابع (functions and return values)

آموزش بعدی : آموزش زبان ++C : چرا توابع مفید هستند؟ چگونه از توابع به صورت موثر استفاده کنیم؟



نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.