Арифметические операции применяются к действительным числам, целым числам и указателям. Определены следующие бинарные арифметические операции:
Обозначение | Операция | Типы операндов и результата | Пример |
+ | сложение | арифметический, указатель | X + Y |
- | вычитание | арифметический, указатель | X - Y |
* | умножение | арифметический | X * Y |
/ | деление | арифметический | X / Y |
% | остаток целочисленного деления | целый | X % Y |
Определены следующие унарные арифметические операции:
Обозначение | Операция | Типы операндов и результата | Примеры |
+ | Унарный плюс (подтверждение знака) | арифметический | +7 |
- | Унарный минус (изменение знака) | арифметический | -X |
++ | инкремент | арифметический, указатель | i++; ++i |
-- | декремент | арифметический, указатель | i--; --i |
Для арифметических операций действуют следующие правила. Бинарные операции сложения (+) и вычитания (-) применимы к целым и действительным числам, а также к указателям.
В операции сложения указателем может быть только один из двух операндов. В этом случае второй операнд должен быть целым числом. Указатель, участвующий в операции сложения, должен быть указателем на элемент массива. В этом случае добавление к указателю целого числа эквивалентно сдвигу указателя на заданное число элементов массива.
В операции вычитания указатель на элемент массива может быть первым операндом (тогда второй операнд - целое число) или оба операнда могут быть указателями на элементы одного массива. Вычитание из указателя целого числа эквивалентно сдвигу указателя на заданное число элементов массива. Вычитание двух указателей возвращает число элементов массива, расположенных между теми элементами, на которые указывают указатели.
В операциях умножения (*) и деления (/) операнды могут быть любых арифметических типов. При разных типах операндов применяются стандартные правила автоматического приведения типов. В операции вычисления остатка от деления (%) оба операнда должны быть целыми числами.
В операциях деления и вычисления остатка второй операнд не может быть равен нулю. Если оба операнда в этих операциях целые, а результат деления является не целым числом, то знак результата вычисления остатка совпадает со знаком первого операнда, а для операции деления используются следующие правила:
- Если первый и второй операнд имеют одинаковые знаки, то результат операции деления - наибольшее целое, меньшее истинного результата деления.
- Если первый и второй операнд имеют разные знаки, то результат операции деления - наименьшее целое, большее истинного результата деления. Округление всегда осуществляется по направлению к нулю.
Унарные операции инкремента (++) и декремента (--) сводятся к увеличению (++) или уменьшению (-) операнда на единицу. Операции применимы к операндам, представляющим собой выражения любых арифметических типов или типа указателя. Причем выражение должно быть модифицируемым L-значением, т.е. должно допускать изменение. Например, ошибочным является выражение ++(а+b), поскольку (а+b) не является переменной, которую можно модифицировать.
Операции инкремента и декремента выполняются быстрее, чем обычное сложение и вычитание. Поэтому, если переменная а должна быть увеличена на 1, лучше применить операцию (++), чем выражения а = а + 1 или оператор а += 1.
Если операция инкремента или декремента помещена перед переменной, говорят опрефиксной форме записи инкремента или декремента. Если операция инкремента или декремента записана после переменной, то говорят, опостфиксной форме записи. При префиксной форме переменная сначала увеличивается или уменьшается на единицу, а затем это ее новое значение используется в том выражении, в котором она встретилась. При постфиксной форме в выражении используется текущее значение переменной, и только после этого ее значение увеличивается или уменьшается на единицу.
Например, в результате выполнения операторов:
int i = 1, j;
j = i++ * i++;
значение переменной i будет равно 3, а переменной j-1. Оператор, присваивающий значение переменной j будет работать следующим образом: сначала значение i, равное 1, умножится само на себя, т.е. вычислится значение выражения в правой части оператора; затем это значение присвоится переменной j, а значение i увеличится на 1 в результате первой операции инкремента и еще раз увеличится на 1 в результате второй операции инкремента.
Если изменить эти операторы следующим образом:
int i = 1, j;
j = ++i * ++i;
то результат будет другим: значение i будет равно 3, а значение j-9. В этом случае оператор, присваивающий значение переменной j будет работать следующим образом: сначала выполнится первая операция инкремента и значение i станет равно 2; затем выполнится вторая операция инкремента и значение i станет равно 3; а затем это значение i умножится само на себя, т.е. вычислится значение выражения в правой части оператора и это значение присвоится переменной j.