Арифметические операции +=, -=, *=, /=, %=

Практический курс по C/C++: https://stepik.org/course/193691

На прошлых занятиях мы с вами подробно познакомились с работой следующих арифметических операций:

Операция

Обозначение

Приоритет

Сложение

+

1

Вычитание

-

1

Умножение

*

2

Деление

/

2

Деление по модулю

%

2

Инкремент

++

3

Декремент

--

3

Так вот на практике первые пять из них довольно часто используются (помимо всего прочего) для изменения существующего значения, например, переменной. О чем здесь речь? Давайте предположим, что имеется целочисленная переменная с именем count и начальным значением 1:

#include <stdio.h>
 
int main(void)
{
    int count = 1;
 
    return 0;
}

Наша задача изменить ее, скажем, увеличить на три. Очевидно, сделать это можно следующим образом:

count = count + 3;

Вначале будет взято значение 1 из переменной count, затем, операция сложения вычислит выражение 1+3 и полученное значение 4 присвоится переменной count. В результате она будет увеличена на 3.

Но это же самое действие в языке Си можно записать и в более краткой форме, а именно:

count += 3;

В данном случае результат действия операции += будет эквивалентно предыдущей строчке программы, то есть, значение переменной count увеличится на 3.

На первый взгляд кажется, что операция += просто подменяет собой запись из операций сложения и последующего присваивания (count = count + 3). Однако между этими действиями есть существенное различие. В операторе:

count = count + 3;

переменная count указана дважды, тогда как в операторе:

count += 3;

только один раз. Казалось бы, какая разница сколько раз прописывать переменную в операторах? И вы будете совершенно правы, если речь идет об обычных переменных. Однако язык Си позволяет выполнять арифметические операции не только с переменными, но вообще с любыми леводопустимыми (l-value) выражениями. Например:

<выражение l-value> = <выражение l-value> + 1;
<выражение l-value> += 1;

Так вот, выражение l-value вполне может при каждом обращении к ней (то есть, вычислении) выдавать разные области памяти. Тогда в первом случае будет получаться один результат, а во втором – другой. Как пример, выражение l-value может быть массивом, а его индексы каждый раз вычисляются при обращении к нему через некоторую функцию. Забегая вперед, формально, это можно записать так:

ar[get_indx()] = ar[get_indx()] + 1;
ar[get_indx()] += 1;

В зависимости от работы функции get_indx() первая и вторая строчки могут приводить к разным результатам вычислений.

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

Список сокращенных арифметических операций

Конечно, кроме операции += можно использовать и другие, а именно:

+=, -=, *=, /=, %=

Это не полный список, но наиболее употребительный. Приоритеты этих операций совпадают с соответствующими приоритетами арифметических выражений. И все они выполняются после любых арифметических действий. Например, в операторе:

count -= 3-5;

сначала будет вычислена разность 3-5 = -2, и только после этого значение -2 вычитается из значения переменной count в соответствии математическим действием:

count - (-2) = count + 2 = 1+2 = 3

И результирующее значение будет равно 3.

Аналогично со всеми остальными сокращенными арифметическими операциями:

#include <stdio.h>
 
int main(void)
{
    int count = 1;
    double var_d = 10;
    short p = 2;
 
    count -= 3 - 5;
    var_d /= 3.0 + p;
    p *= 20 - 5;
 
    printf("count = %d, var_d = %.2f, p = %d\n", count, var_d, p);
 
    return 0;
}

Обратите внимание, при использовании операций /= и *= они выполняются после арифметических действий сложения и вычитания, так как приоритет действий /= и *= ниже любой арифметической операции.

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

Практический курс по C/C++: https://stepik.org/course/193691

Видео по теме