Программирование на C и C++

Онлайн справочник программиста на C и C++

Метки и GOTO

Хотя goto уже давно не рекомендуют использовать, он по-прежнему используется в программах. Мы не будем рассматривать целесообразность его использования с точки зрения элегантности управления программой. Следует заметить, что не существует таких ситуаций, где он был бы единственным решением. Общепринято, что он может быть полезен в некоторых ситуациях, goto используется довольно редко. (В языках типа С, имеющих богатый набор структур управления и предоставляющих дополнительные элементы управления типа break и continue, в нем нет необходимости.) Большинство программистов знают, что goto может легко запутать программу и сделать ее практически нечитабельной. Тем не менее, бывают моменты, когда goto не только не усложняет программу, но даже ее упрощает.

goto требует наличия меток для работы. Метка - это корректный идентификатор С, завершаемый двоеточием. Метка должна находиться в той же функции, что и goto. Например, цикл от 1 до 100 может быть записан с использованием goto и меток следующим образом:

х = 1;
loop1:
х++;
if (х < 100) goto loop1;

Одним из хороших способов использования goto является выход из нескольких уровней вложения. Например:

for(...) {
for (...) {
while (...) {
if (...) goto stop;
...
}
}
}
printf("error in program\n");

Уничтожение goto приведет к необходимости выполнения дополнительных проверок. Простой оператор break здесь не работает, поскольку он может выйти только из самого нижнего цикла.

Если проверяется каждый цикл, то код будет выглядеть следующим образом:

done = 0;
for(...) {
for(...) {
while (...) {
if (...) {
done = 1;
break;
}
...
if(done) break;
}
if(done) break;
}

Следует использовать goto как можно реже. Но если без него код трудно читать или критична cкорость работы программы, то использование goto может быть наилучшим выходом.