Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
85
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

213

потому что до условной части инструкции do while мы дойдем только после первого выполнения тела цикла.

Упражнение 5.14

Какие ошибки допущены в следующих циклах do while:

do

string rsp; int vail, va12;

cout << "Введите два числа: "; c-in >> vail >> va12;

cout << "Сумма " << vail

<<" и " << va12

<<" = " << vail + va12 << "\n\n"

<<"Продолжить? [да][нет] ";

cin >> rsp;

while ( rsp[0] != 'n' );

(b)

do {

//...

}while ( int iva1 = get_response() );

(c)

do {

int ival = get_response(); if ( iva1 == some_value() )

break;

} while ( iva1 );

if ( !iva1 )

(a)

// ...

Упражнение 5.15

Напишите небольшую программу, которая запрашивает у пользователя две строки и печатает результат лексикографического сравнения этих строк (строка считается меньшей, если идет раньше при сортировке по алфавиту). Пусть она повторяет эти действия, пока пользователь не даст команду закончить. Используйте тип string, сравнение строк и цикл do while.

5.8. Инструкция break

Инструкция break останавливает циклы for, while, do while и блока switch. Выполнение программы продолжается с инструкции, следующей за закрывающей фигурной скобкой цикла или блока. Например, данная функция ищет в массиве целых чисел определенное значение. Если это значение найдено, функция сообщает его индекс, в противном случае она возвращает -1. Вот как выглядит реализация функции:

С++ для начинающих

214

// возвращается индекс элемента или

-1

int search( int *ia, int size, int value )

{

 

// проверка что ia != 0 и size > 0 ...

int loc = -1;

for ( int ix = 0; ix < size; ++ix ) { if ( value == ia[ ix ] ) {

//нашли!

//запомним индекс и выйдем из цикла

1oc = ix; break;

}

} // конец цикла

// сюда попадаем по break ...

return 1oc;

}

В этом примере break прекращает выполнение цикла for и передает управление инструкции, следующей за этим циклом, – в нашем случае return. Заметим, что break выводит из блока, относящегося к инструкции for, а не if, хотя является частью составной инструкции, соответствующей if. Использование break внутри блока if, не

// ошибка: неверное использование break if ( ptr ) {

if ( *ptr == "quit" ) break;

// ...

входящего в цикл или в switch, является синтаксической ошибкой:

}

Если эта инструкция используется внутри вложенных циклов или инструкций switch, она завершает выполнение того внутреннего блока, в котором находится. Цикл или switch, включающий тот цикл или switch, из которого мы вышли с помощью break,

white ( cin >> inBuf )

{

switch( inBuf[ 0 ] ) { case '-':

for ( int ix = 1; ix < inBuf.size(); ++ix ) { if ( inBuf[ ix ] == ' ' )

break; // #1

//...

//...

}

break; // #2 case '+':

// ...

}

продолжает выполняться. Например:

}

С++ для начинающих

215

Инструкция break, помеченная // #1, завершает выполнение цикла for внутри ветви case '-' блока switch, но не сам switch. Аналогично break // #2 завершает выполнение блока switch, но не цикла while, в который тот входит.

5.9. Инструкция continue

Инструкция continue завершает текущую итерацию цикла и передает управление на вычисление условия, после чего цикл может продолжиться. В отличие от инструкции break, завершающей выполнение всего цикла, инструкция continue завершает выполнение только текущей итерации. Например, следующий фрагмент программы читает из входного потока по одному слову. Если слово начинается с символа подчеркивания, оно обрабатывается, в противном случае программа переходит к новому

while ( cin >> inBuf ) { if ( inBuf[0] '= '_' )

continue; // завершение итерации

// обработка слова ...

слову.

}

Инструкция continue может быть использована только внутри цикла.

5.10. Инструкция goto

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

Синтаксис goto следующий:

goto метка;

где метка определенный пользователем идентификатор. Метка ставится перед инструкцией, на которую можно перейти с помощью goto, и должна заканчиваться двоеточием. Нельзя ставить метку непосредственно перед закрывающей фигурной

end: ; // пустая инструкция

скобкой. Если же это необходимо, их следует разделить пустой инструкцией:

}

Переход через инструкцию объявления в том же блоке с помощью goto невозможен. Например, данная функция вызывает ошибку компиляции:

С++ для начинающих

216

int oops_in_error() {

//mumble ...

goto end;

//ошибка: переход через объявление

int ix = 10;

// ... код, использующий ix end: ;

}

Правильная реализация функции помещает объявление ix и использующие его

int oops_in_error() { // mumble ...

goto end;

{

//правильно: объявление во вложенном блоке int ix = 10;

//... код, использующий ix

}

end: ;

инструкции во вложенный блок:

}

Причина такого ограничения та же, что и для объявлений внутри блока switch: компилятор должен гарантировать, что для объявленного объекта конструктор и деструктор либо выполняются вместе, либо ни один из них не выполняется. Это и достигается заключением объявления во вложенный блок.

Переход назад через объявление, однако, не считается ошибкой. Почему? Перепрыгнуть через инициализацию объекта нельзя, но проинициализировать один и тот же объект несколько раз вполне допустимо, хотя это может привести к снижению эффективности. Например: