Инкремент и декремент

Перед тем как осваивать циклы, важно изучить часто применяемый метод изменения значений переменных в языке 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 функционирует так же, как в других языках программирования. Условие цикла записывается в круглых скобках. Если тело цикла содержит несколько инструкций, его помещают в фигурные скобки.

Задания:
  1. Установите переменной star значение 0. Пока значение star не достигнет 55, выводите на экран строку с одной звездочкой (*).
  2. Программно реализуйте вывод на экран цифровых кодов и значений таблицы ASCII от 31 до 127 с использованием цикла while. После каждого десятого символа осуществляйте переход на новую строку. (Подсказка: используйте if в цикле while, чтобы проверить остаток1 от деления на 10.)
    Вывод таблицы ASCII с помощью цикла while
  3. Используя внешний и вложенный циклы while, организуйте вывод таблицы умножения на экран.
    Вывод таблицы умножения с помощью цикла 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.

Вопросы для самопроверки:

  1. Какие операции инкремента и декремента существуют в языке программирования C?
  2. В чем разница между префиксной и постфиксной формами оператора инкремента (++i и i++)?
  3. Каково назначение цикла while, и чем цикл do-while отличается от него?
  4. Для чего используется оператор break в циклах, и каков пример его применения?
  5. Приведите пример использования оператора continue в цикле и объясните его цель.
  6. Опишите синтаксис заголовка цикла for и объясните, из каких частей он состоит.

Программа курса:

  1. Описание курса
  2. Введение в язык программирования C
  3. Типы данных в C и форматированный вывод
  4. Символьные типы и управляющие символы в C
  5. Операторы ветвления и switch в C
  6. Циклы и операторы в языке C
  7. Битовые операции в языке C
  8. Посимвольный ввод и вывод в C - буферизация
  9. Переменные, адреса и указатели в C
  10. Передача аргументов по ссылке и значению в C
  11. Форматированный ввод данных с использованием scanf
  12. Генерация псевдослучайных чисел на C
  13. Адресная арифметика в массивах C
  14. Передача массивов в функции и указатели
  15. Строки в языке C - особенности и функции работы
  16. Функции работы со строками в C
  17. Работа со структурами в C - создание и применение
  18. Динамические структуры данных в C
  19. Ввод и вывод данных из файлов в языке C
  20. Передача аргументов в C и работа с файлами
  21. Препроцессор в языке C - директивы и макросы
  22. Создание и компиляция многофайловых программ в C
  23. Использование статических и динамических библиотек в C