Инкремент и декремент
Перед тем как осваивать циклы, важно изучить часто применяемый метод изменения значений переменных в языке C: увеличение или уменьшение на единицу. Конечно, в C можно использовать такие формы, как a += 1 или a -= 1, но гораздо популярнее операции инкремента ("++") и декремента ("--"): i++ или ++i, i-- или --i. Эти операции изменяют значение переменной на единицу.
Запомните, при встрече с выражениями типа ++i или i++ значение i будет изменено. Избегайте конструкций вроде i = ++i, это избыточно.
Если оператор инкремента или декремента предшествует переменной, это называется префиксной формой (++i, --i), а если следует за переменной — постфиксной (i++, i--). В простых случаях разницы между этими формами нет: i++ и ++i оба увеличивают i на единицу.
Однако в составных выражениях разница проявляется: для постфиксной формы переменная сначала используется в выражении, а потом изменяется; в префиксной форме переменная сначала изменяется, а затем используется. Рассмотрим код:
int a, b, c, d;
a=b=c=d=0; // присваиваем 0 всем переменным
printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d);
c = ++a;
d = b++;
printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d);
выведет на экран:
a=0, b=0, c=0, d=0
a=1, b=1, c=1, d=0
Этот результат объясняется следующим образом:
-
значение переменной a было увеличено на единицу перед присваиванием c;
-
значение переменной b сперва присвоено d, а затем увеличено на единицу.
Другой пример:
int x, y;
x = y = 0;
printf("%d\n", x++ > 0);
printf("%d\n", ++y > 0);
На экране будет выведено:
0
1
Это результат логических выражений, где 0 означает ложь, а 1 — истину. Когда x сравнивается с нулем, его значение еще не увеличилось, тогда как при сравнении с у его значение уже превышает ноль.
Операторы инкремента и декремента применимы и к переменным вещественного типа.
Цикл while
Цикл while в языке C функционирует так же, как в других языках программирования. Условие цикла записывается в круглых скобках. Если тело цикла содержит несколько инструкций, его помещают в фигурные скобки.
- Установите переменной star значение 0. Пока значение star не достигнет 55, выводите на экран строку с одной звездочкой (*).
- Программно реализуйте вывод на экран цифровых кодов и значений таблицы ASCII от 31 до 127 с использованием цикла
while
. После каждого десятого символа осуществляйте переход на новую строку. (Подсказка: используйтеif
в циклеwhile
, чтобы проверить остаток1 от деления на 10.) - Используя внешний и вложенный циклы
while
, организуйте вывод таблицы умножения на экран.
1 В языке C операция получения остатка обозначается знаком процента (%).
Цикл do-while
Цикл do-while отличается от while тем, что он гарантированно выполнится хотя бы один раз, независимо от условий. Его синтаксис следующий (фигурные скобки можно опустить для единственного выражения):
do {
выражение1;
…;
} while (логич_выражение);
Этот цикл иногда называют циклом с постусловием. Хотя в большинстве случаев можно обойтись без него, он может упростить код в определенных ситуациях. Например, для вывода отдельных цифр числа на экран. Даже ноль состоит из одной цифры. Следующая реализация с использованием цикла while:
while (a > 0) {
printf("%d\n", a % 10);
a = a / 10;
}
В случае, если a равно 0, цикл не выполнится и одной итерации. Если добавить предварительное условие if, такая проблема решается. Использование цикла do-while может быть более эффективным, так как тело выполнилось бы один раз даже при a = 0:
do {
printf("%d\n", a % 10);
a = a / 10;
} while (a > 0);
Цикл for
Представим синтаксис заголовка цикла for в языке C:
for (часть1; часть2; часть3)
Заголовок цикла for состоит из трех частей, каждая из которых может быть сложной, т.е. содержать несколько выражений, разделенных запятыми. Первая часть обычно присваивает начальные значения переменным, вторая содержит условия для выполнения цикла, а третья — выполняемая после каждой итерации часть, чаще всего изменяющая значение переменной.
Так можно реализовать вывод таблицы символов на экран, используя цикл for:
unsigned char a;
for (a = 31; a < 128; a++) {
if (a % 10 == 0)
printf("\n");
printf("%4d-%c", a, a);
}
printf("\n");
Создайте программу с использованием цикла for для вывода таблицы умножения на экран. Используйте внешний и вложенный циклы, как и в случае с while.
Операторы break и continue
С помощью оператора break можно прервать выполнение цикла, а continue прерывает текущую итерацию. При разработке программы можно обойтись без них, но их использование часто упрощает код и делает его более читабельным.
Рассмотрим несколько примеров. Допустим, необходимо проверить массив на наличие хотя бы одного элемента, равного 0. Обнаружив 0, нет смысла проверять оставшиеся элементы. В этом случае используется оператор break для избежания лишних итераций:
#define N 10
int arr[N] = {6, 5, -4, 3, -7, 2, 7, 0, 3, 9};
int new_arr[N], i, j;
for (i=0; i<N; i++) {
printf("%d ", i); // просто проверка
if (arr[i] == 0) {
printf("Stop. Array contains zero\n");
break;
}
}
printf("\n");
Второй пример: требуется скопировать в новый массив только положительные числа из исходного. Используйте continue, чтобы пропустить итерацию, если элемент меньше или равен нулю:
for(i=0, j=0; i<N; i++) {
if (arr[i] <= 0)
continue;
new_arr[j] = arr[i];
printf("%d ", new_arr[j]); // проверка
j++;
}
printf("\n";)
В этом случае применение continue не столь обязательно и можно заменить его проверкой на противоположное условие, удалив continue и заключив оставшийся код в условие if.