Оператор множественного выбора switch

Оператор switch имеет следующий вид:

switch (выражение) {

case значение1:

действие1;

case значение2:

действие2;

. . .

default: // Необязательный фрагмент

фрагментN;

}

Выражение должно быть дискретного типа (целое число или указатель). Значения должны быть константами того же типа, что и выражение в заголовке. Оператор switch работает следующим образом:

1. сначала вычисляется значение выражения в заголовке switch;

2. затем осуществляется переход на метку "case L:", где константа L совпадает с вычисленным значением выражения в заголовке;

3. если такого значения нет среди меток внутри тела switch, то

· если есть метка "default:", то осуществляется переход на нее;

· если метка "default:" отсутствует, то осуществляется переход на оператор, следующий за switch.

Подчеркнем, что после перехода на метку "case L:" текст программы выполняется последовательно. Например, при выполнении фрагмента программы

int n, k;

n = 2;

switch (n) {

case 1:

k = 2;

case 2:

k = 4;

case 3:

k = 8;

}

переменной k будет присвоено значение 8, а не 4. Дело в том, что при переходе на метку "case 2:" будут выполнена сначала строка

k = 4;

и затем строка

k = 8;

что делает приведенный фрагмент совершенно бессмысленным. Чтобы исправить этот фрагмент, следует использовать оператор

break;

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

int n, k;

n = 2;

switch (n) {

case 1:

k = 2;

break;

case 2:

k = 4;

break;

case 3:

k = 8;

break;

}

В результате выполнения этого фрагмента переменной k будет присвоено значение 4. Если бы значение n равнялось 1, то k было бы присвоено значение 2, если n равнялось бы 3, то 8. Если n не равно ни 1, ни 2, ни 3, то k останется неопределенным.

Оператор цикла while

Цикл while является циклом с предусловием, т.е. условие проверяется перед выполнением тела цикла. В Си для определения цикла while используется следующаий оператор:

while (условие)

действие;

Сначала проверяется условие. Если оно истинно, то выполняется действие. Затем снова проверяется условие; если оно истинно, то снова повторяется действие, и т.д. Цикл завершается, когда условие становится ложным. Пример:

int n, p;

. . .

p = 1;

while (2*p <= n)

p *= 2;

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

Если условие ложно с самого начала, то действие не выполняется ни разу.

Тело цикла может состоять из одного или нескольких операторов. В последнем случае их надо заключить в фигурные скобки.

Оператор цикла for

Цикл for как цикл while является циклом с предусловием. В Си для определения цикла for используется следующаий оператор:

for (инициализация; условие продолжения; итератор)

действие;

Инициализация выполняется один раз перед первой проверкой условия продолжения и первым выполнением тела цикла. Условие продолжения проверяется перед каждым выполнением тела цикла. Если условие истинно, то выполняется действие, иначе цикл завершается. Итератор выполняется после каждого выполнения тела цикла (перед следующей проверкой условия продолжения).

Рассмотрим пример суммирования массива с использованием цикла for:

double a[100]; // Массив a содержит не более 100 эл-тов

int n; // Реальная длина массива a (n <= 100)

double sum; // Переменная для суммы эл-тов массива

int i; // Переменная цикла

. . .

sum = 0.0;

for (i = 0; i < n; ++i)

sum += a[i]; // Увеличиваем сумму на a[i]

Здесь целочисленная переменная i используется в качестве переменной цикла. В операторе инициализации переменной i присваивается значение 0. Условием продолжения цикла является условие i<n. Итератор ++i увеличивает переменную i на единицу. Таким образом, переменная i последовательно принимает значения 0, 1, 2,..., n-1. Для каждого значения i выполняется оператор sum += a[i];.

В большинстве других языков программирования арифметический цикл жестко связан с использованием переменной цикла, которая должна принимать значения из арифметической прогрессии. В Си это не так, здесь инициализация, условие продолжения и итератор могут быть произвольными выражениями, что обеспечивает гораздо большую гибкость программы. Конструкцию цикла for можно реализовать с помощью цикла while:

Например, фрагмент с суммированием массива

for (i=0; i < n; ++i)

sum += a[i];

реализуется с использованием цикла while следующим образом:

i = 0;

while (i < n) {

sum += a[i];

++i;

}

Кроме того, что в цикле for в качестве инициализации и итератора можно использовать любые выражения, можно выполнить несколько действий при инициализации или в итераторе. Для этого язык Си предоставляет операцию "запятая", которая позволяет объединить несколько выражений в одно. Например, фрагмент суммирования массива

sum = 0.0;

for (i = 0; i < n; ++i)

sum += a[i];

можно переписать следующим образом:

for (sum = 0.0, i = 0; i < n; sum += a[i], ++i);

Здесь тело цикла вообще пустое, все действия вынесены в заголовок цикла. Лучше избегать такого стиля программирования: он ничего не добавляет в смысле эффективности готовой программы, но делает текст менее понятным и, таким образом, увеличивает вероятность ошибок.

3.4.6.Оператор цикла do...while

Цикл do...while является циклом с постусловием. Сначала выполняется тело цикла и только после этого проверяется условие продолжения цикла. В Си для определения цикла do...while используется следующаий оператор:

do

действие;

while (условие);

Вначале выполняется действие. Далее проверяется условие и если условие истинно, то снова выполняется действие и так до тех пор пока условие не станет ложным. Таким образом, действие будет выполнено 1 раз, даже если условие ложно с самого начала. Это является потенциальным источником ошибок. Лучше всегда использовать цикл с предусловием while.

Наши рекомендации