زبان برنامه نویسی سی/دستور 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 آن میگوئیم و اگر پارامتری دارد ، داده یا دادههایی به تعداد پارامترهای تابع به آن اصطلاحاً پاس داده
تابع میتواند پارامتری نداشته باشد ؛ که در این صورت '''مجاز نیستیم''' تا دادهای را به عنوان آرگومان
طبق استاندارد ، نوعی که دستور return باز میگرداند باید با نوع داده تعریف تابع یکی باشد در غیر این صورت ممکن است با خطای کامپایلر مواجه شوید ولی برخی از کامپایلرها نوع دادهها را تبدیل و cast میکنند ( مراجعه کنید به تبدیل و جایگزینی دادهها ) و یا در صورت همخوانی نوع دادهها ولی بزرگتر بودن مقدار خروجی از نوع داده تابع ، بزرگترین مقداری که در آن نوع داده تابع ، قابل ذخیره است به عنوان مقدار خروجی ، تعیین میکنند
'''دقت کنید :''' نوع داده پوچ void ، همان طور که در مبحث
'''دقت کنید :''' هر تابعی با نوع دادهای غیر از پوچ یعنی 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 قابل ذخیره است بیشتر نباشد ؛ در غیر این صورت آخرین مقدار قابل ذخیره در صحیح ، در خروجی خطدستوری نمایش داده خواهد شد )
[[رده:زبان برنامه نویسی سی]]
|