Оператор безусловного перехода 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