§ 4. Арифметика

Рассмотрим арифметические операторы языка C.

Оператор

Описание

+

Сложение

-

Вычитание

*

Умножение

/

Деление

%

Остаток от деления

Существуют сокращённые версии операторов для выражений типа foo = foo + bar;.

foo += bar; // foo = foo + bar;
foo -= bar; // foo = foo - bar;
foo *= bar; // foo = foo * bar;
foo /= bar; // foo = foo / bar;
foo %= bar; // foo = foo % bar;

Для инкремента (увеличения на 1) есть особый оператор, которым мы уже пользовались.

i = i + 1; // В принципе, верно.
i += 1;    // Лучше, но так тоже никто не пишет.
++i;       // Предпочтительно.

То же справедливо для декремента (уменьшения на 1).

i = i - 1;
i -= 1;
--i;

У инкремента (и декремента) есть две версии: преинкремент и постинкремент.

int i = 42;
int foo = ++i;  // i равно 43, foo равно 43.
int i = 42;
int foo = i++; // i равно 43, foo равно 42.

Оба эти оператора увеличивают значение своего операнда. Но преинкремент возвращает старое значение, а постинкремент — новое. Стоит заметить, что отдельно стоящий оператор постинкремента не имеет смысла: старое значение возвращается в никуда. Это не страшно, пока речь о стандартных типах, поскольку компилятор позаботится об оптимизации. Но если вы будете когда-нибудь работать со сложными объектами в языке C++, там это может обернуться лишними расходами.

Рассмотрим несколько забавных случаев.

int sum = foo +++ bar;

Это никакой не новый оператор, просто два «слипшихся» оператора.

int sum = foo++ + bar;

И это никакая не стрелка.

if (foo --> bar)
...

А постдекремент и оператор сравнения.

if (foo-- > bar)
...

И вот очень известное выражение.

int i = 5;
i = i++ + ++i;

Не хочется начинать разговор о точках следования, скажу лишь, что в одном выражении не следует дважды менять значение одной переменной (даже писать i = ++i;). Результат вычисления такого выражения может быть разным даже в разных версиях одного компилятора. Подробнее читайте на других интересных ресурсах.

Случайные числа

Часто нужно генерировать случайные числа в программе (на самом деле они псевдослучайные). Подключаем заголовочные файлы <stdlib.h> и <time.h>. Генератор нужно инициализировать, для этого передадим текущее время (функция time()) в функцию srand(). Числа будем получать с помощью функции rand().

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand((unsigned)time(NULL));
    int random = rand() % 10;
    printf("%d", random);
    return 0;
}

В этом примере rand() % 10 будут получаться числа [0, 9], потому что при делении на 10 в остатке будут получаться именно такие числа.

Как сгенерировать число в интервале [−10, 10]? Всего на этом интервале, если посчитать, 21 целое число. Если написать rand() % 21, то получатся числа из интервала [0, 20] — как раз 21 вариант. Если вычесть 10 rand() % 21 - 10, то интервал сместится вниз: [−10, 10].

14 июня