Практический курс по 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;
}
Наша задача
изменить ее, скажем, увеличить на три. Очевидно, сделать это можно следующим
образом:
Вначале будет
взято значение 1 из переменной count, затем, операция сложения вычислит
выражение 1+3 и полученное значение 4 присвоится переменной count. В результате
она будет увеличена на 3.
Но это же самое
действие в языке Си можно записать и в более краткой форме, а именно:
В данном случае
результат действия операции += будет эквивалентно предыдущей строчке программы,
то есть, значение переменной count увеличится на 3.
На первый взгляд
кажется, что операция += просто подменяет собой запись из операций сложения и
последующего присваивания (count = count + 3). Однако
между этими действиями есть существенное различие. В операторе:
переменная count указана дважды,
тогда как в операторе:
только один раз.
Казалось бы, какая разница сколько раз прописывать переменную в операторах? И
вы будете совершенно правы, если речь идет об обычных переменных. Однако язык
Си позволяет выполнять арифметические операции не только с переменными, но
вообще с любыми леводопустимыми (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 в общем
случае не взаимозаменяемы и могут приводить к разным результатам вычислений. И
лучше для изменения значения переменной или, в общем случае, леводопустимого
выражения, использовать операцию +=, так как в ней только один раз фигурирует
это самое выражение.
Список сокращенных арифметических операций
Конечно, кроме
операции += можно использовать и другие, а именно:
+=,
-=, *=, /=, %=
Это не полный
список, но наиболее употребительный. Приоритеты этих операций совпадают с
соответствующими приоритетами арифметических выражений. И все они выполняются
после любых арифметических действий. Например, в операторе:
сначала будет
вычислена разность 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