Справочные данные по языку C++_____________________________637

Для арифметических операций действуют следующие правила.

Бинарные операции сложения (+) и вычитания (—) применимы к целым и дей-
ствительным числам, а также к указателям.

В операции сложения указателем может быть только один из двух операндов.
В этом случае второй операнд должен быть целым числом. Указатель, участвую-
щий в операции сложения, должен быть указателем на элемент массива. В этом
случае добавление к указателю целого числа эквивалентно сдвигу указателя на за-
данное число элементов массива.

В операции вычитания указатель на элемент массива может быть первым опе-
рандом (тогда второй операнд — целое число) или оба операнда могут быть указа-
телями на элементы одного массива. Вычитание из указателя целого числа эквива-
лентно сдвигу указателя на заданное число элементов массива. Вычитание двух
указателей возвращает число элементов массива, расположенных между теми эле-
ментами, на которые указывают указатели. Подробнее об арифметике указателей
см. в главе 12 в разделе 12.7.

В операциях умножения (*) и деления (/) операнды могут быть любых ариф-
метических типов. При разных типах операндов применяются стандартные прави-
ла автоматического приведения типов (см. раздел 12.2 главы 12). В операции вы-
числения остатка от деления (%) оба операнда должны быть целыми числами.

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

1. Если первый и второй операнд имеют одинаковые знаки, то результат опера-
ции деления — наибольшее целое, меньшее истинного результата деления.

2. Если первый и второй операнд имеют разные знаки, то результат операции де-
ления — наименьшее целое, большее истинного результата деления.

Округление всегда осуществляется по направлению к нулю.

Унарные операции инкремента (++) и декремента (—) сводятся к увеличению
(++) или уменьшению (—) операнда на единицу. Операции применимы к операн-
дам, представляющим собой выражения любых арифметических типов или типа
указателя. Причем выражение должно быть модифицируемым L-значением, т.е.
должно допускать изменение. Например, ошибочным является выражение ++(а +
Ь), поскольку (а + Ь) не является переменной, которую можно модифицировать.

Операции инкремента и декремента выполняются быстрее, чем обычное сло-
жение и вычитание. Поэтому, если переменная а должна быть увеличена на 1, луч-
ше применить операцию ++, чем выражения а = а + 1 или оператор а += 1, испо-
льзующий описанную в разделе 11.7.3 операцию +=.
Если операция инкремента или декремента помещена перед переменной, говорят о
префиксной форме записи инкремента или декремента. Если операция инкремен-
та или декремента записана после переменной, то говорят о постфиксной форме
записи. При префиксной форме переменная сначала увеличивается или уменьша-
ется на единицу, а затем это ее новое значение используется в том выражении, в
котором она встретилась. При постфиксной форме в выражении используется те-
кущее значение переменной, и только после этого ее значение увеличивается или
уменьшается на единицу.

Например, в результате выполнения операторов

int i = 1, j;

j = i++ * i++;

значение переменной i будет равно 3, а переменной j — 1. Оператор, присваиваю-
щий значение переменной j будет работать следующим образом: сначала значение
i, равное 1, умножится само на себя, т.е. вычислится значение выражения в пра-
вой части оператора; затем это значение присвоится переменной j, а значение i уве-