Рассмотрим арифметические операторы языка 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].