زبان برنامه نویسی سی/دستور return: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۲۳:
پیش از این چند بار به مفهوم تابع اشاره کرده‌ایم و به صورت مختصر آن را تعریف کرده و به مباحث آن اشاراتی کرده‌ایم . اما در اینجا نیز یک بار دیگر و به صورت کامل‌تر اشاره می‌کنیم ؛ اما فصل بعدی ، فصل تابع است که به صورت کامل و دقیق تمام مباحث تابع را که یک عنصر اصلی در زبان‌های نویسی‌ای همچون C است ، تشریح و تفسیر می‌کنیم . علت این مسئله نیز کاربرد کلیدواژه دستوری return است که مختص تابع است و تنها داخل تابع قابل استفاده است که در صورت نوشته شدن و اجرا ، بلافاصله مابقی کدهای داخل بلوک تابع نادیده گرفته می‌شوند و تابع خروجی تعیین شده توسط دستور return را بازمی‌گرداند
 
تابع ( به انگلیسی Function ) شبیه تابع در ریاضی است ؛ تابع در برنامه‌نویسی ، داده یا داده‌هایی را به عنوان ورودی دریافت می‌کند و سپس معمولاً بر روی آنها پردازشی انجام می‌دهد و داده یا داده‌هایی را به عنوان خروجی ، تحویل می‌دهد . تقریباً تمام زبان‌های برنامه‌نویسی قابلیت تعریف کردن تابع و استفاده از تابع را دارند و زبان C و خانواده آن و تقریباً تمام زبان‌هایی که از سی الگو گرفته‌اند تابع‌گرا هستند تا جایی که حتماً باید تابعی ؛ ورودیورودی‌ها و خروجی‌های برنامه نوشته شده را کنترل کند
 
در برنامه‌نویسی معمولی ( یعنی سطح بالا ) تحت سیستم‌عامل و کرنل Kernel به این تابع main یعنی main function ( به معنی تابع اصلی ) گفته می‌شود که برای خروجی آن باید نوشت
<code>;return 0</code><br>
تا برنامه بعد از اجرا و اتمام آن ، منابع سیستم‌عامل و کامپیوتر را که اشغال کرده است ، آزاد کند ؛ در غیر این صورت برنامه بعد از اجرا و پایان ، همچنان به عنوان پردازه Process در سیستم‌عامل باقی می‌ماند و منابع کامپیوتر را اشغال می‌کند ؛ البته برخی سیستم‌عامل‌ها مثل لینوکس Linux به قدری قدرتمند هستند که برنامه‌های بی‌مصرف و اضافه را شناسایی کرده و حذف می‌کنند . البته در برنامه‌نویسی سطح پائین نیز مانند نوشتن کامپایلر ( Compiler ) و یا میان‌افزار ( Firmware ) و کرنل ( Kernel ) شما مجازید از تابع main استفاده کنید ، که البته متداول نیست ولی باید حتماً تابعی را به عنوان تابع اصلی برنامه ، تعریف کنید و البته با خواندن راهنمای کامپایلر خود ، با دادن دستورات ویژه‌ای به کامپایلر ، برنامه خود را نه برای سیستم‌عاملی ؛ که به زبان ماشین ترجمه کنید . در زبان C تمام کارهای شما توسط تابع‌ها انجام می‌شوند ، شما نمی‌توانید از دستورهای شرطی و یا حلقه‌ها خارج از تابع‌ها استفاده کنید و اگر استفاده کنید برنامه شما دارای خطا یا همان باگ Bug خواهد شد
 
به غیر از تابع main هر تابعی باید قبل از استفاده ، تعریف شود ( definition ) تا تعیین کند که تابع چه ورودی‌هایی می‌گیرد که برای تابع به عنوان پارامتر ( parameter ) در مقابل شناسه و نام تابع ، داخل یک جفت پرانتز باز و بسته نوشته می‌شوند ( مثل int func1(int a, int b) که در اینجا func1 نام و شناسه تابع است که از نوع صحیح int می‌باشد و دو پارامتر صحیح با نام‌های a و b دارد ) که پارامترها را نیز با عملگر کاما ( در پارسی به معنی ویرگول ) باید از یکدیگر جدا کنید و سپس معمولاً پردازش‌هایی را بر روی پارامترها انجام می‌دهید و در نهایت با دستور return مشخص می‌کنید که تابع چه خروجی‌ای می‌دهد . تابع ، زمانی که تعریف شد باید همانند متغیرها بدون نوع داده نوشته شود که به این کار فراخوانی call تابع و یا احضار invoke آن می‌گوئیم و اگر پارامتری دارد ، داده یا داده‌هایی به تعداد پارامترهای تابع به آن اصطلاحاً پاس داده شودشوند ( pass ) یا به اصطلاحی دیگر ارجاع داده شودشوند ( referencing ) تا تابع همان طور که تعریف شده پردازش‌هایی را بر روی آن داده‌ها که در مقابل تابع '''هنگام احضار''' نوشته شده‌اند ( که آن داده‌ها به اضطلاح آرگومان Argument می‌گویند ) انجام دهد و خروجی‌‌ای را تحویل دهد که می‌تواند در یک متغیر یا داده دیگر ذخیره شود و یا اصلاً خود تابع به عنوان آرگومان به یک تابع دیگر پاس داده شود ( و این از قدرت‌های زبان C است ) . در تعریف تابع ، خروجی را با دستور return تعیین می‌کنیم . اما گاهی تابع را در جایی دیگر تعریف می‌کنیم و پیش از تعریف تابع از آن استفاده کرده و به اصطلاح آن را فراخوانی و احضار می‌کنیم که در این صورت ، حتماً باید پیش از استفاده ؛ تابع را اعلان و به اصطلاح prototype کنیم که نوع داده تابع و پارامترهای آن یک به یک و به ترتیب باید با تعریف آن یکسان باشند ( در غیر این صورت کامپایلر از شما خطا خواهد گرفت و error می‌دهد ) . همچنین شما می‌توانید یک تابع را به عنوان مقدار یک متغیر ، احضار کنید تا خروجی تابع در متغیر ذخیر شود و پردازشی را بر روی آن متغیر انجام دهید ضمن اینکه تابع‌ها حوزه سراسری دارند و می‌توانید یک تابع را داخل تابعی دیگر احضار و فراخوانی کنید ولی نمی‌توانید ، تابعی را داخل تابعی دیگر تعریف کنید
 
تابع می‌تواند پارامتری نداشته باشد ؛ که در این صورت '''مجاز نیستیم''' تا داده‌ای را به عنوان آرگومان بابه تابع پاس بدهیم در غیر این صورت ، کامپایلر از ما خطا خواهد گرفت . ضمن اینکه گاهی برای جلوگیری از کد زدن اضافه ، مجموعه‌ای از حکم‌ها را داخل تابع می‌نویسیم تا با هر بار احضار آن تابع ، آن حکم‌ها به اجرا گذاشته شوندبگذارد . '''دقت کنید''' تعداد آرگومان‌هایی که به تابع پاس داده می‌شوند و نوع داده آنها حتماً باید با نوع داده در تعریف پارامترهای تابع به ترتیبی که تعریف شده‌اند و تعداد آن‌ها یکی باشد که البته شما می‌توانید پارامترهای تابع را طوری تعریف کنید که تابع ، بی‌شمار آرگومان پذیرا باشندباشد که در فصل بعدی به آن می‌پردازیم و نیازمند استفاده از فایل سرآیند مرتبط به خود است که در مباحث مربوطه ، مفصلاً به آنها خواهیم پرداخت
 
طبق استاندارد ، نوعی که دستور return باز می‌گرداند باید با نوع داده تعریف تابع یکی باشد در غیر این صورت ممکن است با خطای کامپایلر مواجه شوید ولی برخی از کامپایلرها نوع داده‌ها را تبدیل و cast می‌کنند ( مراجعه کنید به تبدیل و جایگزینی داده‌ها ) و یا در صورت همخوانی نوع داده‌ها ولی بزرگ‌تر بودن مقدار خروجی از نوع داده تابع ، بزرگ‌ترین مقداری که در آن نوع داده تابع ، قابل ذخیره است به عنوان مقدار خروجی ، تعیین می‌کنند .( مثل GCC ) ضمن اینکه شما با نوشتن کدهایی می‌توانید از داده‌های خیلی بزرگ هم استفاده کنید که برنامه‌های نوشته شده و آماده آن نیز در فضای وب موجود است
 
'''دقت کنید :''' نوع داده پوچ void ، همان طور که در مبحث خودخودِ آن نیز گفته شد می‌تواند تابع را نیز تعریف کند ، اما تابع‌های پوچ قادر به بازگرداندن هیچ مقداری نیستند ، بنابراین هر گونه دستور return داخل تابع پوچ که بخواهد مقداری را بازگرداند خطا است و شما مجاز به بازگرداندن مقداری در تابع پوچ نیستید و در صورت نوشتن چنین کدی ، کامپایلر از شما خطا خواهد خواهد گرفت . شما می‌توانید در تابع پوچ بنویسید : ;return که نوع نوشتن خوش فرمخوش‌فرم آن نیز هست و سعی کنید همیشه استاندارد و خوش‌فرم بنویسید
 
'''دقت کنید :''' هر تابعی با نوع داده‌ای غیر از پوچ یعنی void ، مثل int یا long یا char باید طبق استاندارد ، حتماً دارای دستور return باشد و در غیر این صورت کامپایلر ممکن است از شما خطا بگیرد و در صورت خطا نگرفتن نیز ، قطع به یقین برنامه شما دارای خطا و باگ Bug خواهد بود و مشکل‌دار کار می‌کند
 
مثال :
خط ۷۱:
در مثال بالا ، ابتدا فایل سرآیند stdio ( که سرنام standard input/output می‌باشد - به معنی ورودی/خروجی استاندارد ) با دستور مستقیم include ضمیمه برنامه خود نموده‌ایم که در آن تابع‌های printf و scanf تعریف شده‌اند که این دو تابع کتابخانه‌ای استاندارد C ، به ترتیب printf ( سرنام print formatted به معنی چاپ فرمت‌شده ) کاراکتر یا رشته‌ای از حروف ، علامات و یا اعداد را در خروجی خط‌دستوری چاپ می‌کند و scanf ( سرنام scan formatted به معنی خواندن فرمت‌شده ) تابعی است که از ورودی تعریف شده برای خود و معمولاً صفحه‌کلید ( Keyboard کیبورد ) کاراکتر یا رشته‌ای را که حروف ، علامات و یا اعداد هستند دریافت می‌کند
 
سپس تابعی با نام mult مخفف multiplication به معنی ضرب ( در ریاضی ) را اعلان نموده‌ایم ( اصطلاحاً prototype ) که دو پارامتر با نام‌های a و b دارد که هر دو از نوع داده متغیر صحیح هستند int . تابع اصلی برنامه یعنی تابع main چاپ می‌کند که دو عدد را وارد کنید ( Enter Two numbers ) سپس دو متغیر صحیح با نام‌های i و j هر دو با مقدار 0 تعریف می‌کند که درست بعد از آن ، تابع scanf ، مقادیر آنها را دریافت می‌کند ( این مباحث را به صورت مفصل در فصل فایل‌های سرآیند تشریح می‌کنیم ) . سپس تابع printf یک مقدار صحیح را چاپ می‌کند که مقدار آن از فراخوانی ( و یا همان احضار ) تابع mult بر روی آرگومان‌های i و j که اعدادی هستند که توسط کاربر وارد شده‌اند ، به دست می‌آید
 
اما تابع mult در جایی دیگر تعریف شده است ( یعنی بعد از تابع main ) ؛ درست همانند اعلان آن ، یک داده صحیح است و دو متغیر صحیح با نام‌های a و b دارد که در آن متغیر صحیحی به نام c اعلان شده است که تعریف آن ضرب پارامتر a در پارامتر b است و سپس تابع ، مقدار c را بازمی‌گرداند . بدیهی است که با کامپایل برنامه ، شما دو عدد را که قابلیت ذخیره در یک صحیح را داشته باشند می‌توانید وارد کنید تا ضرب آن دو را در هم ، در خروجی خط‌دستوری ببینید ( به شرط اینکه ضرب آن دو عدد از آخرین مقداری که در نوع داده int قابل ذخیره است بیشتر نباشد ؛ در غیر این صورت آخرین مقدار قابل ذخیره در صحیح ، در خروجی خط‌دستوری نمایش داده خواهد شد )
 
[[رده:زبان برنامه نویسی سی]]