دوست عزیز برنامه‌نویس، توی این آموزش می‌خوایم دستور جالب goto رو در زبان C بررسی کنیم؛ ابزاری برای پرش در جریان اجرای برنامه. البته استفاده‌ش باید با دقت باشه، چون اگه بی‌رویه استفاده بشه، کدت رو گیج‌کننده و سخت‌خوان می‌کنه!

goto در C: پرش فوری به یه نقطه خاص!

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

ساختارش ساده‌ست:

goto label;

// ...

label:
    // کدهایی که باید اجرا بشه

اسم label باید یه شناسه معتبر باشه که با : تعریف شده باشه. وقتی به اون پرش می‌کنی، برنامه از همون‌جا ادامه پیدا می‌کنه.

مثال: محاسبه مجموع و میانگین تا وقتی عدد منفی وارد نشه

این برنامه از کاربر عدد می‌گیره و مجموع و میانگینشون رو حساب می‌کنه؛ ولی اگه عدد منفی وارد بشه، با دستور goto از حلقه خارج میشه و مجموع فعلی رو نشون میده:

// محاسبه مجموع و میانگین تا وقتی کاربر عدد منفی وارد نکرده
#include <stdio.h>

int main() {
    const int maxInput = 100;
    int i;
    double number, average, sum = 0.0;

    for (i = 1; i <= maxInput; ++i) {
        printf("%d. Enter a number: ", i);
        scanf("%lf", &number);

        // اگر عدد منفی بود، پرش به برچسب jump
        if (number < 0.0) {
            goto jump;
        }

        sum += number;
    }

    jump:
    average = sum / (i - 1);
    printf("Sum = %.2f\n", sum);
    printf("Average = %.2f\n", average);
    return 0;
}

نمونه خروجی:

1. Enter a number: 3
2. Enter a number: 4.3
3. Enter a number: 9.3
4. Enter a number: -2.9
Sum = 16.60
Average = 5.53

به محض وارد شدن عدد منفی مثل -2.9، برنامه فوراً با دستور goto به برچسب jump می‌ره و بقیه کدها اجرا می‌شن.

Image

چرا معمولاً از goto استفاده نمی‌کنن؟

هرچند goto گاهی مفیده، ولی اغلب باعث پیچیدگی و غیرقابل پیگیری شدن جریان برنامه میشه. برای مثال:

one:
for (i = 0; i < number; ++i) {
    test += i;
    goto two;
}

two:
if (test > 5) {
    goto three;
}

// ...

three:
// کدی غیرمعلوم!

تو این مثال، پرش‌های متعدد می‌تونه ردیابی و درک برنامه رو سخت کنه. مخصوصاً اگه از چند جای مختلف به یه برچسب پرش شده باشه، فهمیدن ترتیب اجرا خیلی سخت میشه!

پس بالاخره استفاده کنیم یا نه؟ 🤔

اگه واقعاً راه ساده‌تری وجود نداره، مثلاً وقتی بخوای از چند حلقه تو در تو یه‌باره خارج بشی، goto می‌تونه کمک‌کننده باشه. ولی بهتره تا جایی که می‌تونی از ساختارهایی مثل break، continue و توابع استفاده کنی و از پرش مستقیم اجتناب کنی.

به قول بجارن استروستروپ (خالق C++): “این واقعیت که goto می‌تونه هر کاری انجام بده، دقیقاً همون دلیله که نباید ازش استفاده کنیم.”

امیدواریم این آموزش براتون مفید بوده باشه! این مقاله توسط سایت علمی رایشمند برای شما آماده شده است.