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

محتوای حذف‌شده محتوای افزوده‌شده
صفحه‌ای تازه حاوی «==دستور بروبه goto== دستور « برو به ... » که به انگلیسی می‌شود « ... go to » و با کلیدو...» ایجاد کرد
(بدون تفاوت)

نسخهٔ ‏۱۴ ژانویهٔ ۲۰۲۰، ساعت ۱۳:۱۱

دستور بروبه goto

دستور « برو به ... » که به انگلیسی می‌شود « ... go to » و با کلیدواژه goto نوشته می‌شود روند اجرای برنامه را از جایی که کلیدواژه نوشته شود به بخش دیگری از برنامه که با برچسب « label » مشخص شده است انتقال می‌دهد . هر برچسب دارای یک نام یا شناسه است که همانند نام یا همان شناسه متغیرها می‌باشد و باید اختصاصی و انحصاری باشد . یعنی شما نمی‌توانید دو برچسب را با یک نام بنویسید یا نام برچسب را نام یا همان شناسه یک متغیر انتخاب کنید . نحوه نوشتن یک برچسب ( label ) بدین شکل است :


label-identifier: statement-1;

در مقابل نام برچسب باید یک کالن یا دو نقطه بگذارید و طبق استاندارد ISO سپس حداقل یک حکم در مقابل آن بنویسید . مثلاً :


result: printf("%d\n", j);

در اینجا result یک برچسب است با شناسه و نام result که اگر بنویسید ;goto result روند اجرای برنامه به برچسب result می‌رود و خط‌به‌خط از آنجا به بعد ادامه یافته و کدها اجرا می‌شوند . برچسب می‌تواند پس از goto یا قبل از goto نوشته شده باشد .

کاربرد goto عموماً برای خروج از حلقه می‌باشد ؛ مثلاً حلقه در جال اجرا و تکرار است که اگر شرطی برقرار شد ، برنامه از حلقه خارج شود و به بیرون از حلقه و ادامه برنامه برود . از goto برای ایجاد یک حلقه نیز استفاده می‌شود . مثلاً یک برچسب را می‌نویسید و سپس شرطی را می‌نویسید ؛ که متغیر شرط در خط بعدی یا خطوط بعدی تغییر می‌کند و در انتهای آن از دستور goto برای ارجاع به برچسب استفاده می‌کنید که کامپایلر باز می‌گردد به خطوط قبلی و آنها را اجرا می‌کند و سپس دوباره به goto می‌رسد پس دوباره باز می‌گردد به خطوط و کدهای قبلی و آنها را اجرا می‌کند و این در حالیست که در هر بار اجرا متغیر شرط به برقرار نبودن نزدیک می‌شود تا جایی که در نهایت برقرار نیست و بنابراین goto نیز اجرا نمی‌شود و ادامه برنامه دنبال می‌شود . این روش مانند ساخت یک حلقه است اما به هیچ وجه توصیه نمی‌شود . شما می‌توانید از goto برای ایجاد اتصال میان بخش‌های مختلف کدها نیز استفاده کنید ؛ اما این نیز توصیه نمی‌شود چرا که برنامه شما را ناخوانا و پیچ در پیچ می‌کند ( حتی ممکن است خود شما نیز به اشتباه بیافتید که در نهایت برنامه خروجی ، نتیجه مطلوب را نخواهد داشت )

در مجموع سعی کنید به ندرت از goto استفاده کنید ، آن هم فقط برای خروج از حلقه در صورتی که نمی‌خواهید با break آن را بشکنید .دقت کنید که از goto تنها داخل بدنه تابع می‌توان استفاده نمود و به هر جای تابع که برچسبی داشته باشد ، دسترسی دارد و به آنجا می‌پرد ( jump ) یعنی از یک قسمت از برنامه که دارد اجرا می‌شود به قسمت دیگری از برنامه می‌رود ( که مسلماً به واسطه ;goto label-identifier اتفاق میافتد ) اما دقت کنید که goto نمی‌تواند از داخل یک تابع به داخل تابع دیگری برود ؛ یعنی هر برچسب ، محلی می‌باشد و داخل تابع خود معنا و حضور می‌یابد