Операторы, условия и циклы языка Си

мая 6, 2012  |  Published in Си и C++


Из серии:

  1. Введение в программирование на Си
  2. Переменные и типы данных в Си
  3. * Операторы, условия и циклы языка Си

Си включает в себя всего 3 цикла и 2 условных оператора. Набор арифметических операторов и операторов сравнения стандартен. В данной статье мы сначала бегло пробежимся по арифметическим операторам и операторам сравнения, а затем перейдем к изучению циклов и условий, в которых познакомимся с операторами еще более подробно. Операторы работы с бинарными данными мы рассмотрим в отдельной статье посвященной работе с битами и байтами.

Арифметические и логические операторы
= — присваивание (самый низкий приоритет),
+ — сложение,
- — вычитание,
* — умножение,
/ — деление,
% — остаток от деления на цело,
() — скобки имеют наивысший приоритет и используются для увеличения приоритета других действий, например сложения.

Пример:

#include <stdio.h>

int main(void) {
    int a = 5, b =10, c = 25, d = 100, result;

    printf("%d + %d = %d\n",  a, b, a + b);
    printf("%d - %d = %d\n",  a, b, a - b);
    printf("%d / %d = %d\n",  d, c, d / c);
    printf("%d * %d = %d\n",  c, a, c * a);
    printf("%d %% %d = %d\n", c, b, c % b);

    result = (c + d) / a * b;

    printf("result is: %d\n", result);
}

Результат:

5 + 10 = 15
5 — 10 = -5
100 / 25 = 4
25 * 5 = 125
25 % 10 = 5
result is: 250

К логическим операторам относятся следующие:
> — больше,
< — меньше,
>= — больше или равно,
<= — меньше или равно,
== — равно,
!= — не равно

Соединители логических условий:
&& — И,
|| — ИЛИ.
! — НЕ

Пример использования в условии IF:

#include <stdio.h>

int main(void) {
    int a = 5, b =10, c = 25, d = 100, result;

    if (b > a)
        printf("b > a\n");

    if (a >= b || b <= c)
        printf("a >= b OR b <= c\n");

    if (a == c / a && (c % a) == 0) {
        printf("c = a * a\n");
    }

    return 0;
}

Данная программа в результате выполнения напечатает следующее:

b > a
a >= b OR b <= c
c = a * a

Условные операторы
После знакомства с арифметическими и логическими операторами пора познакомиться и с операторами позволяющими создавать условия. С одним вы уже познакомились выше — это условие IF («ЕСЛИ») которое выполняет следующую после него единственную строку кода или блок кода, если условие в круглых скобках верно.

У условия с IF имеется еще альтернативная форма  IF-ELSE (ЕСЛИ-ИНАЧЕ) Пример:

#include <stdio.h>

int main(void) {
    int a = 5, b =10, c = 25, d = 100, result;

    if (b > a) {
        printf("b > a\n");
    } else {
        printf("b < a\n");
    }

    return 0;
}

А вот еще один пример, только на этой раз IF-ELSE IF-ELSE:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    if (b > a) {
        printf("b > a\n");
    } else if (b == a) {
        printf("b == a\n");
    } else {
        printf("b < a\n");
    }

    return 0;
}

Последний пример позволяет выполнить только дно из трех действий (один из блоков кода), а следующие после этого действия проверки игнорируются. Так, если b > a, то проверка на то, равно ли b == a производиться не будет.

Другой способ создать проверку условия — это использовать конструкцию SWITCH-CASE-DEFAULT. Ниже приведен пример:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    switch (d) {
        case 5:
            printf("d = 5\n");
            break;
        case 10: case 25:
            printf("d = 10 or 25\n");
            break;
        case 100:
            printf("d = 100\n");
            break;
        default:
            printf("d = d");
            /* здесь break не обязателен */
            break;
    }

    return 0;
}

Оператор switch принимает в качестве аргумента какое-либо значение, значение которой необходимо проверить. case 5:, case 10:, case 25: case 100: default: — являются метками, которые используются в операторе switch и goto для перемещения по коду. Конкретно метки case и default используются в switch, оператор ищет их и проверяет их соответствие значению переменного аргумента. В нашем случае значению 100 переменной d соответствует метка case 100:. Когда найдена соответствующая метка, программа выполняет ассоциируемый с нею код, то есть будет выполнена функция printf() и оператор break. Если ни одна метка не будет соответствовать значению аргумента, то будет выполнен код метки default:. Метка default: не обязательна, вы можете ее не использовать в тех случаях, когда она будет лишней.

Цикл WHILE

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

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    while (a <= d) {
        if (a % 10 == 0)
            printf("%d ", a);

        a += 5;
    }

    printf("\n");

    return 0;
}

Результат:

10 20 30 40 50 60 70 80 90 100

Цикл while принимает условие и выполняет блок кода до тех пор, пока условие верно. Мы обязаны каждый каждый раз увеличивать значение переменной a, которая фигурирует в условии, иначе мы получим бесконечный цикл.

Цикл DO…WHILE
Цикл do…while очень похож на цикл while, однако он является циклом с пост-условием. То есть условие выполнения блока кода проверяется после выполнения, а не до, что гарантирует то, что код выполнится минимум один раз. Ниже приведен пример:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    do {
        printf("%d ", a);
    } while (a >= d);

    printf("\n");

    return 0;
}

По условиям while блок кода не должен выполнится, однако он выполнится один раз потому, что мы используем цикл do…while. Реализовать цикл do…while через while очень просто — достаточно выполнить функцию или содержимое блок кода перед использованием цикла, а затем использовать их в цикле.

Цикл FOR

Цикл for является продвинутой версией циклов. for сразу заботится об инициализации и инкременте счетчика. Пример:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    for(int i = 0; i <= d; i += 10) {
        printf("%d ", i);
    }

    printf("\n");

    return 0;
}

Результат:

0 10 20 30 40 50 60 70 80 90 100

Как видите, мы сразу объявляем, что счетчик цикла должен увеличиваться после каждой итерации.

После знакомства с циклами и условными операторами давайте вернемся к упомянутому ранее break.

Оператор BREAK

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

#include <stdio.h>

int main(void) {
    int a = 5, b = 10, c = 25, d = 100, result;

    switch (d) {
        case 5:
            printf("d = 5\n");
        case 10: case 25:
            printf("d = 10 or 25\n");
        case 100:
            printf("d = 100\n");
        default:
            printf("d = d\n");
    }

    return 0;
}

Результат:
d = 100
d = d

Еще break очень полезен в ситуациях, когда мы не знаем точно когда необходимо завершить работу цикла. В таком случае принято использовать концепцию «стоп слов» -значений, которые позволяют программе понять, что цикл необходимо завершить. Пример:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[100];

    while (1) {
        printf("Введите слово: ");
        scanf("%s", str);
        printf("\n");

        if (strcmp(str, "exit") != 0) {
            printf(">> %s\n", str);
        } else {
            printf("bye!\n");
            break;
        }
    }

    return 0;
}

Пример работы:

$ ./a.out
Введите слово: Hello!

>> Hello!
Введите слово: RubyDev

>> RubyDev
Введите слово: exit

bye!

Оператор CONTINUE
Оператор continue похож на оператор break. Отличием continue от break является то, что если break останавливает выполнение кода (например цикла), то continue позволяет остановить только текущую итерацию и перейти к следующей. Перепишем пример выше с использованием continue:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[100];

    while (1) {
        printf("Введите слово: ");
        scanf("%s", str);
        printf("\n");

        if (strcmp(str, "exit") != 0) {
            printf(">> %s\n", str);
        } else {
            continue;
            /* выполнено не будет */
            printf("bye!\n");
        }
    }

    return 0;
}

Пример работы:

$ ./a.out
Введите слово: exit

Введите слово: exit

Введите слово: RubyDev

>> RubyDev
Введите слово:

На этом знакомство с операторами в Си закончем. По goto, как и по работе с битами будет отдельная статья.

Tags: , , ,

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.