Продолжим изучать особенности операций в C++. Мы с вами уже рассматривали арифметические операции над целочисленными типами: сложение, вычитание и умножение. И, в принципе, они работают именно так, как вы от них и ожидаете, и примерно так же, как во многих других языках. Давайте поподробнее изучим деление, потому что у него есть определенные особенности. Давайте объявим переменную a типа int и запишем в нее, например, 11. Объявим также переменную b, пусть она будет равна 3. Хорошо. И давайте выведем значение выражения a / b. Скомпилируем нашу программу, запустим и видим, что вывелось 3, ровно 3, то есть деление у нас выполнилось нацело. Мы взяли 11 и нашли целую часть от деления 11 на 3. То есть у нас оба аргумента деления — и делимое, и делитель — являются целыми числами. Поэтому и результат деления также оказался целым числом. Если же мы теперь объявим переменную b как double и скомпилируем нашу программу и запустим, то увидим, что в консоль вывелось значение 3.(6), то есть у нас один из аргументов оказался дробным числом — это b, оно имеет тип double, — и поэтому результат деления это также дробное число. Если, например, мы скажем, что не переменная b имеет тип double, а переменная a, то наша программа продолжит выводить дробное число. Таким образом, этот пример показывает, что операция деления ведет себя по-разному, в зависимости от типов своих аргументов. Если оба аргумента деления являются целыми числами, то деление выполняется нацело. Если же хотя бы один аргумент имеет тип double, то и результат деления также будет не целым числом — будет иметь тип double. Теперь давайте рассмотрим другой пример. Допустим, у нас есть переменная x, равная 5. И мы хотим увеличить ее на 2. Как мы можем это записать? Мы можем написать: x = x + 2. Давайте выведем значение переменной x, убедимся, что у нас все правильно и она будет равна 7. Да, действительно, она равна 7. Вот какой недостаток есть у этой записи? В ней есть явное дублирование кода: мы переменную x указываем дважды, хотя на самом деле что мы хотим? Мы хотим взять и увеличить x на 2. И такая запись чревата ошибками: мы можем, записывая x во второй раз, опечататься, и в лучшем случае наша программа на скомпилируется, а в худшем будет работать неправильно и нам придется тратить время на отладку. Мы этого не хотим. Вот для таких случаев в C++ есть специальная короткая форма записи операции изменения переменной. Мы тоже самое можем написать как x += 2. Давайте скомпилируем и убедимся, что я нигде не ошибся. Действительно, это компилируется и работает и выводит 7. В этой записи мы избегаем дублирования, переменная наша указана только один раз, что снижает вероятность допустить ошибку. И такая форма записи есть для всех арифметических операций: мы можем их все здесь продемонстрировать. Вот наша программа компилируется, считает, выводит вот какое-то число. Она выводит 5, потому что мы прибавили 2, вычли 2, умножили на 2, разделили на 2. В итоге у нас получается 5. Вот, значит, теперь вы знакомы с такой формой записи арифметических операций. Но это еще не все. Очень часто в программах приходится изменять значение на 1, например в циклах. И в C++ решили для этой операции сделать отдельный синтаксис. Вот смотрите: возьмем опять нашу переменную x и захотим увеличить ее на 1. Мы можем написать, базируясь на тех знаниях, которые у нас уже есть: это как x += 1. Вот это можно написать еще короче. Можно написать x++. Это будет увеличение x на 1. Теперь давайте возьмем нашу переменную x и переименуем ее в c. Смотрите, у нас получилось c++. Итак, давайте скомпилируем нашу программу, выполним ее, увидим, что да, переменная c была равна 5, стала равна 6. Действительно, операция c++ увеличивает переменную c на 1. Но есть еще одна форма записи инкремента — это так называемый префиксный инкремент ++c. Если мы им воспользуемся и скомпилируем нашу программу, увидим, что два инкремента подряд действительно увеличивают переменную дважды на 1, и у нас получилось 7. У вас может возникнуть вопрос: а зачем же в языке иметь одну и ту же операцию в двух разных формах? Это какая-то избыточность, какой в ней смысл? На самом деле, есть различие в поведении префиксного и постфиксного инкрементов. Давайте это различие изучим. Давайте изменим нашу программу так. Объявим переменную a и присвоим ей результат выполнения операции c++. Также объявим переменную b и запишем туда то, что у нас возвращает ++c. Да, инкремент действительно что-то возвращает. И давайте выведем, чему у нас равны переменные a и переменная b. Скомпилируем нашу программу, запустим и вот мы видим, что a у нас равно 5, а b равно 7. Чтобы понять что происходит, давайте запустим отладчик. Так нам будет проще разобраться, как работает программа. Итак, значит, я запускаю отладчик. Отладчик запускается, отладчик запустился и он не видит, где у меня лежит файл. Сейчас мы это быстро исправим. Все, отладчик видит файл с исходником. И давайте начнем выполнять нашу программу. Итак, первым делом мы объявили переменную c и записали в нее 5. Значит, теперь мы собираемся присвоить переменной a значение операции c++. Вот здесь вот вверху справа у нас есть текущие значения локальных переменных. Выполним нашу операцию и посмотрим, что у нас произошло с локальными переменными. Мы видим, что переменная c увеличилась на 1 и стала равна 6, а в переменную a мы записали значение 5. То есть что произошло? В переменную a записалось то значение переменной c, которое она имела до инкремента. Теперь давайте выполним следующую команду — запишем в b результат префиксного инкремента. И давайте посмотрим, что у нас получилось со значениями переменных. У нас c стало равно 7. У нас было 6, мы увеличили на 1, а получили 7. И b также стало равно 7. То есть что мы видим? Мы видим, собственно, отличия в работе префиксного и постфиксного инкрементов. Постфиксный инкремент возвращает то значение, которое было до увеличение переменной на 1, а префиксный возвращает то значение, которое у переменной стало, после того как мы произвели увеличение на 1. Собственно, запомнить, какой из инкрементов что возвращает довольно легко — читаем слева направо. c++ — то есть сначала возьмем c, потом увеличим и вернем то, что взяли. А ++c — сначала увеличим, а потом вернем значение переменной c. Таким образом легко запомнить, какой из инкрементов что возвращает. И точно так же есть операция декремента, которая уменьшает переменную на 1. Вот так у нас программа компилируется, работает и, действительно, c уменьшается на 2. Подведем итоги. В этом и предыдущем видео вы узнали о поведении операции присваивания и об особенностях арифметических операций в C++. Теперь вы знаете, что присваивание C++ выполняет глубокое копирования, вы знаете, что оператор деления ведет себя по-разному в зависимости от типов своих аргументов. Вы познакомились с префиксным и постфиксным инкрементом и знаете разницу в их поведении и какие значения они возвращают.