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

محتوای حذف‌شده محتوای افزوده‌شده
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۲۳:
در اینجا result یک برچسب است با شناسه و نام result که اگر بنویسید ;goto result روند اجرای برنامه به برچسب result می‌رود و خط‌به‌خط از آنجا به بعد ادامه یافته و کدها اجرا می‌شوند . برچسب می‌تواند پس از goto یا قبل از goto نوشته شده باشد .
 
یکی از کاربردهای goto برای خروج از حلقه‌های تو در تو می‌باشد ؛ مثلاً فرض کنید شما یک برنامه‌ای می‌نویسید که مبتنی بر هوش مصنوعی است و در هنگام نوشتن هوش مصنوعی ( مثل پروژه CGI ) مجبورید از حلقه‌های خیلی زیادی که تو در تو نیز هستند استفاده کنید ؛ مثلاً فرض کنید ۸ حلقه تو در تو در دارید که اگر شرط خاصی برقرار بود باید تمام حلقه‌ها بشکنند و از تکرار آنها جلوگیری شود ؛ اگر بخواهید از روش متداول شکستن حلقه‌ها استفاده کنید باید یک به یک در حلقه‌ها شرط خود را بنویسید که اگر برقرار بود با دستور break حلقه ، شکسته شود ؛ پس شما ۸ بار باید کد تکراری را بزنید در حالی که با نوشتن یک برچسب بیرون از هر ۸ حلقه ( و پس از آنها ) و نوشتن یک goto داخل حلقه مورد نظر و داخلی اجرای تمام حلقه‌ها را متوقف کنیدمی‌کنید و روند اجرای برنامه را به بیرون از حلقه‌ها و ادامه برنامه می‌رودمی‌فرستید . از goto برای ایجاد یک حلقه نیز استفاده می‌شود . مثلاً یک برچسب را می‌نویسید و سپس شرطی را می‌نویسید ؛ که متغیر شرط در خط بعدی یا خطوط بعدی تغییر می‌کند و در انتهای آن از دستور goto برای ارجاع به برچسب استفاده می‌کنید که کامپایلر باز می‌گردد به خطوط قبلی و آنها را اجرا می‌کند و سپس دوباره به goto می‌رسد پس دوباره باز می‌گردد به خطوط و کدهای قبلی و آنها را اجرا می‌کند و این در حالیست که در هر بار اجرا متغیر شرط به برقرار نبودن نزدیک می‌شود تا جایی که در نهایت برقرار نیست و بنابراین goto نیز اجرا نمی‌شود و ادامه برنامه دنبال می‌شود . این روش مانند ساخت یک حلقه است '''اما به هیچ وجه توصیه نمی‌شود''' . شما می‌توانید از goto برای ایجاد اتصال میان بخش‌های مختلف کدها نیز استفاده کنید ؛ اما این نیز توصیه نمی‌شود چرا که برنامه شما را ناخوانا و پیچ در پیچ می‌کند ( حتی ممکن است خود شما نیز به اشتباه بیافتید که در نهایت برنامه خروجی ، نتیجه مطلوب را نخواهد داشت ) مثلاً فرض کنید شما چند حلقه و دستورها و عملگرهای مختلفی داخل تابع خود دارید و با کمک دستورهای شرطی و دستور goto ، مرتب برنامه را از این قسمت به آن قسمت و از آن قسمت به این قسمت ، پاس کاری می‌کنید ولی این کار درک برنامه را مشکل می‌کند و تقریباً هیچ برنامه‌نویس حرفه‌ای و استادی چنین کد زدنی را به برنامه‌نویسان توصیه نمی‌کند . احیاناً اگر قصد چنین کاری را نیز دارید باید حتماً سورس کامپایلر خود را ( در صورت متن باز بودن Open Source بودن ) بخوانید تا بدانید کامپایلر به چه شکل کدهای goto را ترجمه می‌کند
 
در مجموع سعی کنید تا زمانی که نیازی نیست از goto استفاده نکنید . دقت کنید که از goto تنها داخل بدنه تابع می‌توان استفاده نمود و به هر جای تابع که برچسبی داشته باشد ، دسترسی دارد و به آنجا می‌پرد ( jump ) یعنی از یک قسمت از برنامه که دارد اجرا می‌شود به قسمت دیگری از برنامه می‌رود ( که مسلماً به واسطه ;goto label-identifier اتفاق میافتد ) اما '''دقت کنید''' که goto نمی‌تواند از داخل یک تابع به داخل تابع دیگری برود ؛ یعنی هر برچسب ، محلی می‌باشد و داخل تابع خود معنا و امکان حضور می‌یابد