C++; Оператор присваивания и арифметические операции

В прошлой теме узнали что такое переменная, и научились считывать значение с клавиатуры. Это конечно здорово, но хочется научится делать что-то более интересное. Нужно добавить какого-то движения, переменные должны взаимодействовать друг с другом. Тут нам помогут операторы. Начнем с самого главного из них — оператора присваивания.

Оператор присваивания

Оператор присваивания — специальная штука, которая сначала вычисляет значения выражения справа от себя, а потом записывает его в переменную слева от себя. Обозначается оператор присваивания знаком =. На примере должно стать понятнее.

#include<iostream>

using namespace std;

int main()
{
    int foo;                // заводим переменную foo
    foo = 2 + 2;            // записываем в нее значение выражения 2 + 2
    cout << foo << endl;    // выводим на экран значение переменной foo
}

В примере помимо оператора присваивания = появилась еще одна одна новая сущность — строчки, начинающиеся с символа //. Их называют комментариями, нужны они для того, чтобы пояснить код программы. Компилятор на них просто не обращает внимания. Напомним, что компилятор — программа, которая переводит с человеческого языка на компьютерный.

Вернемся к разбору программы. В первой строке мы завели переменную foo, а во второй записали в нее результат, который получается после вычисления выражения 2 + 2. Последней строкой мы выводим значение переменной foo на экран, таким образом наша программа выводит на экран 4.

Код нашей программы можно сократить, оператор присваивания можно использовать в той же строчке, в которой мы заводим переменную. Следующая программа делает то же, что и предыдущая.

#include<iostream>

using namespace std;

int main()
{
    int foo = 2 + 2;        // заводим переменную foo и записываем в нее значение выражения 2 + 2
    cout << foo << endl;    // выводим на экран значение переменной foo
}

В выражениях справа от оператора = могут участвовать переменных, а не только числа. Например так:

#include<iostream>

using namespace std;

int main()
{
    int foo = 2;         // заводим переменную foo и записываем в нее 2 
    int bar = foo;       // заводим переменную bar 
                         // и записываем в нее значениее переменной foo, то есть 2
    cout << bar << endl; // выводим значение переменной bar, то есть 2
}

Арифметические операции в С++

Операции над целыми числами

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

Операцию сложения мы уже использовали в примерах выше . Давайте посмотрим на примеры использования всех этих операций.
Программа:

#include<iostream>

using namespace std;

int main()
{
    int one = 1;
    int two = 2; 
    int three = 3;

    cout << "two + two = " << two + two << endl;    \\ выводим сначала пояснительную строчку "two + two",
                                                    \\ а потом значение выражения two + two  
    cout << "two - one = " << two - one << endl;
    cout << "two * two = " << two * two << endl;
    cout << "three / two = " << three / two << endl;
    cout << "three % two = " << three % two << endl;
}

Вывод:

two + two = 4
two - one = 1
two * two = 4
three / two = 1
three % two = 1

С операциями +, - и * все понятно, получилось правильное значение, а вот к операции деления / есть вопросы. Почему 3 / 2 = 1?

Помните, что int — тип для целых чисел? Значит и деление для него целочисленное. То есть C++ делит с остатком. Три на два не делится, неполное частное 1, остаток 1. То есть все правильное, единица и должна была получится. Остаток, кстати, тоже посчитался правильно, 3 % 2 = 1.

Арифметические операции над числами вещественными числами (числами с плавающей точкой)

Помните, что кроме типа для целых чисел int, у нас был и тип для вещественных чисел double. Давайте посмотрим как работают операции для него.
Программа:

#include<iostream>

using namespace std;

int main()
{
    double one = 1;
    double two = 2; 
    double three = 3;

    cout << "two + two = " << two + two << endl;
    cout << "two - one = " << two - one << endl;
    cout << "two * two = " << two * two << endl;
    cout << "three / two = " << three / two << endl;
}

Вывод:

two + two = 4
two - one = 1
two * two = 4
three / two = 1.5

Сложение и умножение отработали так же, а вот деление дало другой результат. Для переменных тип double получилось 3 / 2 = 1.5. Так и должно быть, делим мы здесь уже не с остатком, а в обычном смысле.

Тонкости: приведение типов и приоритет операций.

Мы уже обсудили, что для разных типов данных арифметические операции выполняются по разному. А что происходит если у переменных разный тип? Ответ, происходит неявно приведение типов, но сейчас обсуждать мы его не будем во избежание путаницы. Интересующиеся могут обратиться к статье на википедии.

Приоритет операций, он же порядок действий

Помните, в школе объясняли что такое порядок действий? Сначала выполняются умножение и деление, а потом сложение и вычитание. В программировании эта договоренность сохраняется. Кроме того, появляется целая система, которая называется приоритетом операторов. Про нее тоже есть хорошая статья на википедии.

Скобки тоже работают так, как учили в школе. Операции в скобках выполняются раньше тех, которые вне скобок. Посмотрим на пример.
Программа:

#include<iostream>

using namespace std;

int main()
{
    int one = 1;
    int two = 2; 
    int three = 3;

    cout << "three * two + one = " << three * two + one  << endl;
    cout << "three * (two + one) = " << three * (two + one)  << endl;
}

Вывод:

three * two + one = 7
three * (two + one) = 9