زبان برنامه نویسی سی/دستور return: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
بدون خلاصۀ ویرایش |
جزبدون خلاصۀ ویرایش |
||
خط ۳:
===دستور return===
دستور '''return''' با معنی بازگرداندن که به کامپایلر در فایل سی تفهیم میکند که '''برگردان''' ؛ مقداری را که تابع باید بازگرداند ، تعیین میکند ؛ تا به عبارت دیگر ، تابع ، مقداری را به عنوان خروجی ، با دستور return بازگرداند . فرم کلی استفاده از آن به شکل :
{{چپچین}}
خط ۱۹:
{{پایان چپچین}}
میباشد که در فرم اول به جای value که معنی '''مقدار''' را میدهد ، میتوان یک مقدار عددی یا کاراکتری را نوشت ( که میتواند یک کاراکتر یا یک رشته باشد و یا یک عدد یک رقمی یا چند رفمی و یا حتی عدد اعشاری باشد ) تا به عنوان خروجی تابع ، بازگردانده شود . اما در فرم دومِ استفاده از دستور return به جای مقدار ، یک '''عبارت''' را که خود میتواند از چند زیر عبارت تشکیل شده باشد ، در برابر دستور return مینویسیم تا در تابع ، ارزیابی شود و سپس مقدار به دست آمده به عنوان خروجی تابع ، برگردانده شود ( که بهتر است و معمولاً عبارات توسط جفت پرانتزهای باز و بسته نوشته میشوند )
پیش از این چند بار به مفهوم تابع اشاره کردهایم و به صورت مختصر آن را تعریف کرده و به مباحث آن اشاراتی کردهایم . اما در اینجا نیز یک بار دیگر و به صورت کاملتر اشاره میکنیم ؛ اما فصل بعدی ، فصل تابع است که به صورت کامل و دقیق تمام مباحث تابع را
تابع ( به انگلیسی Function ) شبیه تابع در ریاضی است ؛ تابع در برنامهنویسی ، داده یا دادههایی را به عنوان ورودی دریافت میکند و سپس معمولاً بر روی آنها پردازشی انجام میدهد و داده یا دادههایی را به عنوان خروجی ، تحویل میدهد . تقریباً تمام زبانهای برنامهنویسی قابلیت تعریف کردن تابع و استفاده از تابع را دارند و زبان C و خانواده آن و تقریباً تمام زبانهایی که از سی الگو گرفتهاند تابعگرا هستند تا جایی که حتماً باید تابعی ؛ ورودی و خروجیهای برنامه نوشته شده را کنترل کند
در برنامهنویسی معمولی ( یعنی سطح بالا ) تحت سیستمعامل و کرنل Kernel به این تابع main یعنی main function ( به معنی تابع اصلی ) گفته میشود که برای خروجی آن باید نوشت
;return 0 تا برنامه بعد از اجرا و اتمام آن ، منابع سیستمعامل و کامپیوتر را که اشغال کرده است ، آزاد کند ؛ در غیر این صورت برنامه بعد از اجرا و پایان ، همچنان به عنوان پردازه Process در سیستمعامل باقی میماند و منابع کامپیوتر را اشغال میکند ؛ البته برخی سیستمعاملها مثل لینوکس Linux به قدری قدرتمند هستند که برنامههای بیمصرف و اضافه را شناسایی کرده و حذف میکنند . البته در برنامهنویسی سطح پائین نیز مانند نوشتن کامپایلر ( Compiler ) و یا میانافزار ( Firmware ) و کرنل ( Kernel ) شما مجازید از تابع main استفاده کنید ، که البته متداول نیست ولی باید حتماً تابعی را به عنوان تابع اصلی برنامه تعریف کنید و البته با خواندن راهنمای کامپایلر خود ، با دادن دستورات ویژهای به کامپایلر برنامه خود را نه برای سیستمعاملی ؛ که به زبان ماشین ترجمه کنید . در زبان C تمام کارهای شما توسط تابعها انجام میشوند ، شما نمیتوانید از دستورهای شرطی و یا حلقهها خارج از تابعها استفاده کنید و اگر استفاده کنید برنامه شما دارای خطا یا همان باگ Bug خواهد شد به غیر از تابع main هر تابعی باید قبل از استفاده ، تعریف شود ( definition ) تا تعیین کند که تابع چه ورودیهایی میگیرد که برای تابع به عنوان پارامتر ( parameter ) در مقابل شناسه و نام تابع ، داخل یک جفت پرانتز باز و بسته نوشته میشوند ( مثل int func1(int a, int b) ) که پارامترها را نیز با عملگر کاما ( در پارسی به معنی ویرگول ) باید از یکدیگر جدا کنید و سپس معمولاً پردازشهایی را بر روی پارامترها انجام میدهید و در نهایت با دستور return مشخص میکنید که تابع چه خروجیای میدهد . تابع ، زمانی که تعریف شد باید همانند متغیرها بدون نوع داده نوشته شود که به این کار فراخوانی call تابع و یا احضار invoke آن میگوئیم و اگر پارامتری دارد ، داده یا دادههایی به تعداد پارامترهای تابع به آن اصطلاحاً پاس داده شود ( pass ) یا به اصطلاحی دیگر ارجاع داده شود ( referencing ) تا تابع همان طور که تعریف شده پردازشهایی را بر روی آن دادهها که در مقابل تابع هنگام احضار نوشته شدهاند ( به اضطلاح آرگومان Argument ) انجام دهد و خروجیای را تحویل دهد که میتواند در یک متغیر یا داده دیگر ذخیره شود و یا اصلاً خود به عنوان آرگومان به یک تابع دیگر پاس داده شود ( و این از قدرتهای زبان C است ) . در تعریف تابع خروجی را با دستور return تعیین میکنیم . اما گاهی تابع را در جایی دیگر تعریف میکنیم و پیش از تعریف تابع از آن استفاده کرده و به اصطلاح آن را فراخوانی و احضار میکنیم که در این صورت ، حتماً باید پیش از استفاده ؛ تابع را اعلان و به اصطلاح prototype کنیم که نوع داده تابع و پارامترهای آن یک به یک و به ترتیب باید با تعریف آن یکسان باشند . همچنین شما میتوانید یک تابع را به عنوان مقدار یک متغیر ، احضار کنید تا خروجی تابع در متغیر ذخیر شود و پردازشی را بر روی آن متغیر انجام دهید ضمن اینکه تابعها حوزه سراسری دارند و میتوانید یک تابع را داخل تابعی دیگر احضار و فراخوانی کنید ولی نمیتوانید ، تابعی را داخل تابعی دیگر تعریف کنید
تابع میتواند پارامتری نداشته باشد ؛ که در این صورت مجاز نیستیم تا دادهای را به عنوان آرگومان با تابع پاس بدهیم در غیر این صورت ، کامپایلر از ما خطا خواهد گرفت . ضمن اینکه گاهی برای جلوگیری از کد زدن اضافه ، مجموعهای از حکمها را داخل تابع مینویسیم تا با هر بار احضار آن تابع آن حکمها به اجرا گذاشته شوند . دقت کنید تعداد آرگومانهایی که به تابع پاس داده میشود و نوع داده آنها حتماً باید با نوع داده در تعریف پارامترهای تابع و تعداد آنها یکی باشد که البته شما میتوانید پارامترهای تابع را طوری تعریف کنید که بیشمار آرگومان پذیرا باشند که در فصل بعدی به آن میپردازیم و نیازمند استفاده از فایل سرآیند
طبق استاندارد نوعی که دستور return باز میگرداند باید با نوع داده تابع یکی باشد در غیر این صورت ممکن است با خطای کامپایلر مواجه شوید ولی برخی از کامپایلرها نوع دادهها را تبدیل و cast میکنند ( مراجعه کنید به تبدیل و جایگزینی دادهها ) و یا در صورت همخوانی نوع دادهها ولی بزرگتر بودن مقدار خروجی از نوع داده تابع ، بزرگترین مقداری که در آن نوع داده تابع قابل ذخیره است به عنوان مقدار خروجی ، تعیین
'''دقت کنید :''' نوع داده پوچ void همان طور که در مبحث خود آن نیز گفته شد میتواند تابع را نیز تعریف
'''دقت کنید :''' هر تابعی با نوع دادهای غیر از پوچ void مثل int یا long یا char باید طبق استاندارد حتماً دارای دستور return باشد و در غیر این صورت کامپایلر ممکن است از شما خطا بگیرد و در صورت خطا نگرفتن نیز ، قطع به یقین برنامه شما دارای خطا و باگ Bug خواهد بود و مشکلدار کار میکند
|