ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4242
Скачиваний: 28
Глава 4. Управляющие инструкции
61
default:
инструкции
}
Работает инструкция
switch
следующим образом. Сначала вы-
числяется значение
выражения
, при этом завершаются все побоч-
ные эффекты. Затем полученное значение
выражения
сравнивается
с константами, и управление передается на ту
инструкцию
, для ко-
торой это сравнение дает значение "истина". То есть ключевое
слово
case
и следующая за ним константа определяют просто
метку инструкции, на которую может быть передано управление.
Для выхода из блока
case
используется оператор
break
(см.
разд. 4.5)
. Если значение
выражения
не совпадает ни с одной из
констант, то управление передается
инструкции
с меткой
default
.
А если этой метки нет, то управление передается инструкции,
следующей за блоком инструкции
switch
. Инструкция
switch
ис-
пользуется в основном для "разбора случаев". Например:
int x = 2, y = 0;
switch(x)
{
case 0:
case 1: ++y;
case 2: y += 2;
case 3: y += 3;
} /* y = 5 */
На инструкцию
switch
накладываются следующие ограничения:
выражение и константы в инструкции
switch
должны иметь
интегральный тип;
две константы не могут иметь одинаковое значение;
при сравнении значения выражения с константами использу-
ется интегральное продвижение по типам.
Относительно метки
default
справедливы следующие замечания:
вариант
default
не обязателен;
если вариант
default
присутствует, то он не обязательно дол-
жен быть последним.
Часть I. Язык программирования С
62
В языке программирования C переменные могут объявляться
только в начале блока
switch
, а в языке программирования C++ и
внутри блока. Кроме того, в языке программирования С++ нельзя
инициализировать переменные, объявленные в блоке
switch
.
4.3. Инструкции цикла
while
и
do...while
Инструкция цикла
while
имеет следующий синтаксис:
while (выражение)
инструкция
Работает инструкция
while
следующим образом. Сначала вычис-
ляется значение
выражения
, при этом завершаются все побочные
эффекты. Результат вычисления
выражения
должен иметь арифме-
тический тип или указатель. Если полученное значение истинно,
то выполняется
инструкция
. Так повторяется до тех пор, пока зна-
чение
выражения
не станет ложным. Например:
int a = -2;
while (a)
++a; /* a = 0 после выхода их цикла */
Выражение
после ключевого слова
while
часто называют
условием
продолжения цикла
. Если это условие выполняется, то цикл про-
должается. В противном случае цикл завершается.
Инструкция цикла
do...while
имеет следующий синтаксис:
do
инструкция
while (выражение);
Работает инструкция
do...while
следующим образом.
Инструкция
выполняется до тех пор, пока значение
выражения
остается истин-
ным. Но в отличие от инструкции
while
, значение
выражения
вы-
числяется всякий раз после выполнения
инструкции
и это значе-
ние должно иметь арифметический тип или быть указателем.
Глава 4. Управляющие инструкции
63
То есть в случае
do...while
инструкция отработает хотя бы один
раз, независимо от значения выражения.
Например:
int a = -2;
do
++a;
while(a); /* a = 0 после выхода из цикла */
4.4. Инструкция цикла
for
Инструкция цикла
for
имеет следующий синтаксис:
for (выражение_1; выражение_2; выражение_3)
инструкция
Работает инструкция
for
следующим образом. Перед началом
цикла один раз вычисляется
выражение_1
. Значение
выражения_2
вычисляется каждый раз перед выполнением
инструкции
. Если это
значение равно истинна, то выполняется
инструкция
, в противном
случае цикл заканчивается. После каждой итерации цикла вычис-
ляется
выражение_3
. При вычислении выражений завершаются все
побочные эффекты. Например, следующий цикл находит сумму
цифр от 1 до 9:
int i, s = 0;
for ( i = 1; i < 10; ++i)
s += i; /* s = 45 после выхода из цикла */
В языке программирования С++
выражение_1
может содержать
объявления переменных. В этом случае объявленная переменная
видима только в цикле
for
.
Учитывая это замечание, в языке программирования С++ этот же
цикл можно записать следующим образом:
int s = 0;
for ( int i = 1; i < 10; ++i)
s += i;
Часть I. Язык программирования С
64
Относительно выражений в инструкции
for
нужно сделать сле-
дующее замечание. Как каждое в отдельности, так и все вместе
выражения в инструкции
for
могут отсутствовать. Если отсутст-
вует
выражение_2
, то считается, что оно постоянно истинно. По-
этому инструкция:
for (;;)
инструкция
описывает бесконечный цикл.
4.5. Инструкция перехода
break
Инструкция
break
прекращает работу циклов
while
,
do...while
и
for
, а также выполняет выход из блока
switch
. Например:
int x = 1, y = 0;
switch(x)
{
case 0:
--y;
break;
case 1:
++y;
break;
default:
y = 10;
} /* y = 1 */
Инструкция
break
чаще всего используется в том случае, если
внутри цикла получено такое значение некоторого выражения,
которое делает продолжение цикла невозможным. Конечно, луч-
ше вставлять такую проверку в условие продолжения цикла. Но
это не всегда возможно, если проверка условия продолжения
цикла требует нетривиальных предварительных вычислений.
4.6. Инструкция перехода
continue
Инструкция
continue
завершает текущую итерацию циклов
while
,
do...while
,
for
и передает управление на вычисление условия
Глава 4. Управляющие инструкции
65
цикла. То есть инструкция
continue
прерывает исполнение тела
цикла и передает управление на начало этого цикла.
Например:
int x = -10, y = 0;
while (x)
{
++x;
if (!(x + y))
continue;
--y;
} /* x = 0, y = -10 после выхода из цикла */
Как и в случае с инструкцией
break
, если это возможно, то инст-
рукцию цикла
continue
лучше не использовать для продолжения
цикла.
4.7. Метки инструкций
и инструкция перехода
goto
Метка инструкции
состоит из идентификатора, за которым сле-
дует символ
:
, и может стоять перед любой инструкцией. На-
пример:
err: s = 0;
Метка инструкции используется для передачи управления на эту
инструкцию при помощи инструкции
goto
, которая имеет сле-
дующий вид:
goto метка;
Областью видимости
метки
является функция, в которой эта
метка
определена. Поэтому передачу управления посредством инструк-
ции
goto
можно выполнять только внутри функции. При этом
отметим, что инструкция
goto
чаще всего используется для пере-
дачи управления наверх из вложенных управляющих инструкций
в случае возникновения ошибки. Иначе, программа считается не-
структурной. Ниже показан пример использования инструкции
goto
.