زبان برنامه نویسی سی/دستور return: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
جزبدون خلاصۀ ویرایش |
بدون خلاصۀ ویرایش |
||
خط ۲۲:
پیش از این چند بار به مفهوم تابع اشاره کردهایم و به صورت مختصر آن را تعریف کرده و به مباحث آن اشاراتی کردهایم . اما در اینجا نیز یک بار دیگر و به صورت کاملتر اشاره میکنیم ؛ اما فصل بعدی ، فصل تابع است که به صورت کامل و دقیق تمام مباحث تابع را یک که یک عنصر اصلی در زبانهای نویسیای همچون C است ، تشریح و تفسیر میکنیم . علت این مسئله نیز کاربرد کلیدواژه دستوری 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 همان طور که در مبحث خود آن نیز گفته شد میتواند تابع را نیز تعریف کنید ، اما تابعهای پوچ قادر به بازگرداندن هیچ مقداری نیستند ، بنابراین هر گونه دستور return داخل تابع پوچ که بخواهد مقداری را بازگرداند خطا است و شما مجاز به بازگرداندن مقداری در تابع پوچ نیستید و کامپایلر از شما خطا خواهد خواهد گرفت . شما میتوانید در تابع پوچ بنویسید : ;return که نوع نوشتن خوش فرم آن نیز هست و سعی کنید همیشه استاندارد بنویسید
'''دقت کنید :''' هر تابعی با نوع دادهای غیر از پوچ void مثل int یا long یا char باید طبق استاندارد حتماً دارای دستور return باشد و در غیر این صورت کامپایلر ممکن است از شما خطا بگیرد و در صورت خطا نگرفتن نیز ، قطع به یقین برنامه شما دارای خطا و باگ Bug خواهد بود و مشکلدار کار میکند
[[رده:زبان برنامه نویسی سی]]
|