Date Редакция Категория comp Теги C

Оператор безусловного перехода goto появился еще в ассемблере. В те годы не существовало операторов вроде while и for, и циклы приходилось строить с помощью условий, меток и переходов. Так, цикл вроде

while (a[i] < 10)
    i++;

мог быть записан как (Ben Klemens. 21st Century C: C Tips from the New School, O'Reilly Media, 2012, глава 7.):

label 1:
if a[i] >= 10
    goto label 2
i = i + 1
goto label 1
label 2:

А теперь представьте себе, что несколько подобных циклов вложены друг в друга... После этого немудрено, что использование goto, мягко говоря, не поощрялось. И все же существует, по крайней мере, одна область, где goto уместен и упрощает код. Это -- освобождение ресурсов при выходе из функции (Денис Юричев. Заметки о языке программирования Си/Си++, 2013, с. 6):

void fun(...)
{
    byte* buf1 = malloc(...);
    byte* buf2 = malloc(...);

    ...

    if (something_goes_wrong_1)
        goto cleanup_and_exit;
    ...

    if (something_goes_wrong_2)
        goto cleanup_and_exit;

    ...

cleanup_and_exit:
    free(buf1);
    free(buf2);
    return;
};


Комментарии

comments powered by Disqus