240 Часть II. Программирование на C++
goto
Оператор перехода goto переводит управление программой на заданный оператор-метку. Целевая метка должна находиться внутри той же самой функции, что и оператор goto. Оператор перехода, так же как и оператор switch, не может быть выполнен в обход инициализации переменной в той же или вышестоящей области видимости. Как и в случае оператора switch, решение в том, чтобы заключить инициализацию локальной переменной в скобки, чтобы при переходе полностью пропускался блок, сожержащий инициализацию.
Операторы goto обычно являются результатом неряшливого программирования. За логикой программы, в которой содержатся операторы goto, может быть чрезвычайно трудно уследить. Только в очень редких случаях использование оператора goto уместно и прибавляет программе ясности.
Листинг 10.10 демонстрирует пример неоправданного использования оператора goto: он использован дяя выхода из циклов for и while,вместо двух операторов break.
ftinclude <iostream.h>
void main() {
const unsigned MAX_STR_LEN =100;
const char с = '$' ;
char s[MAX_STR_LEN] ;
cout « "\пВведите строку с секретным символом (Выход по <Ctrl+C>).\n" while (cin.getlinefs, MAX_STR_LEN-1)) {
// Считаем общее число символов в s, исключая завершающий нуль. char *sp = s;
int len = 0;
while (*sp++) ++len;
for (int i = 0; i < len; i++) if (s[i] == c) goto YOU_WIN;
cout « "\пИзвините. Попробуйте еще раз.\п";
}
cout « "\пВ следующий раз вам повезет больше.\п"; ' goto EMD; // Никаких поздравлений. YOU_WIN:
cout « "\пПоздравляю. Вы очень догадливы!\п";
END:; // Закрывающая скобка не может идти за меткой. }