Простейшая математика
Чтобы двигаться дальше, нам нужно обсудить некоторые тонкости использования в С++ простейших математических действий вроде сложения, вычитания, умножения и деления.
Допустим, мы хотим к значению переменной х прибавить 2. В первой строке объявим х равным 1 и во второй строке прибавим к нему 2:
int x = 1;
x = x + 2;
В итоге х станет равным 3.
Можно ли вторую строку записать короче? Да, вот так:
x += 2;
В очередной раз напомню, что операндами, то есть тем, с чем вы оперируете, слева от знака равенства могут быть только переменные, а справа - со всеми остальными знаками вроде +
, -
, /
, *
- и переменные, и сами числа.
При использовании переменной в таком случае операндом служит значение переменной, то есть содержащееся в ней число. После выражения не забывайте ставить точку с запятой.
Рассмотрим вычитание. Сходным образом:
int x = 1;
x = x - 2;
Тут от х мы отнимаем 2. Либо, сокращенно:
x -= 2;
Умножение. Для умножения используется знак *
(звездочка).
int x = 2;
x = x * 2;
или:
x *= 2;
Деление. Для деления служит оператор /
(косая черта). При делении чисел могут возникать дробные числа. Однако, если результат записывается в переменную целого типа, такого как int, то результат не округляется согласно правилам округления, но получается отбрасыванием дробной части:
int x = 16 / 5;
х будет равен 3.
Полезно пробовать сказанное далее на примере 08-01.cpp:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
int x = 16 / 5;
cout << x << endl;
return 0;
}
Привычно идем в консоли в каталог с файлом, компилируем:
g++ 08-01.cpp
Запускаем. Под Линуксом:
./a.out
Под Windows:
a.exe
Жмем энтер.
Так, на экран вывелось “3”.
А что, если мы хотим работать с дробями? Казалось бы, достаточно заменить тип х с целочисленного int на дробный float:
float x = 16 / 5;
Что же, пробуем…
Черт, снова выдает тройку. В чем же дело? Прикол в том,что 16 и 5 - целые числа, и операция деления вернула нам тоже целое число. Операторы +
, -
, *
, =
действуют точно как функции и результат их выполнения тоже строго типизирован.
Есть несколько способов исправить дело. Первый - явно указать компилятору, что мы хотим использовать числа с дробями. Вот так:
float x = 16.0 / 5.0;
Компилятор видит точки, отделяющие целую часть от дробной, и результатом деления, записанным в х, будет 3.2.
Другой способ заключается в применении операции, которая называется приведением типа. Это когда мы заставляем вместо одного типа использовать другой.
float x = (float) 16 / 5;
Тут мы предваряем 16 типом float, заключенным в скобки. Это значит, что 16 превратится в 16.0, приведётся к дробному типу float. После чего компилятор автоматически приведет к тому же типу правый операнд деления, 5. И 5 тоже станет 5.0.
Если хоть один из операндов дробный, к дробному типу автоматически будет приведен и второй операнд.
Посмотрим полный пример, 08-02.cpp, и попробуем откомпилировать и запустить программу:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
float x = 16 / (float) 5;
cout << x << endl;
return 0;
}
Такой синтаксис, где название типа заключено в скобки и служит для выполнения приведения типа, присущ языку программирования Си, предшественнику С++.
Более присущий С++ способ приведения типа похож на вызов функции. Именем функции служит имя типа, а указываемым в скобках параметром - приводимое к типу значение:
float x = float (16) / 5;
Наконец третий способ, который вы сейчас явно не захотите использовать:
float x = static_cast<float> (16) / 5;
Итак, тут для приведения типа используется конструкция static_cast<имя типа=""> (переменная или число).имя>
Да, еще - делить на ноль нельзя! Программа вылетит.
Посмотрим на примере 08-03.cpp, как в С++ работает автоматическое приведение типов:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
float x = 5.5;
int y = 5;
cout << y + x << endl;
return 0;
}
Мы объявили дробную переменную x и целочисленную y, и потом выводим на консоль результат их сложения. Поскольку х у нас float, дробь, то y приводится к тому же типу, на выходе получаем 10.5.
Напишем другой пример, 08-04.cpp:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
float x = 5.5;
int y = 5 + x;
cout << y << endl;
return 0;
}
Те же переменные, но к целому y мы прибавляем сумму из 5 и значения дробной переменной х. Получилось бы 10.5, но y у нас целочисленного типа. Выводим значение одного только y, получается 10. Заметим - 10.5 не округлилось до 11, но дробная часть просто отбросилась и осталось целое 10.
Теперь еще кое-что про сложение и вычитание. Зачастую нужно уменьшить или увеличить значение переменной на единицу. Это удобно в разных переменных счетчиках.
Конечно, можно написать так:
int x = 1;
x = x + 1;
Тут х станет двойкой.
Но можно записать это иначе, используя операторы увеличения и уменьшения ++
или --
. Их называют операторами инкремента и декремента.
int x = 1;
x++; //добавляем единицу
x--; //отнимаем единицу
Теперь важно! Операторы ++
и --
имеют две формы, префиксную и постфиксную, то есть могут предшествовать переменной или следовать за нею.
Можно написать
x++;
или
++x;
В чем разница?
Когда мы пишем одной строкой
x++;
или
++x;
разницы никакой, после выполнения этой строки х увеличится на единицу.
Но что, если мы напишем так (08-05.cpp):
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
int x = 2;
cout << x++ << endl;
return 0;
}
Запустим программу. x был равен 2, мы выводим на консоль значение x, увеличивая его на единицу оператором ++. Вроде должно написаться 3, но выводится 2. Ошибка? Нет.
Поставим теперь плюсы перед иксом (08-06.cpp):
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
int x = 2;
cout << ++x << endl;
return 0;
}
Компилируем, запускаем… Вот, теперь вывелось 3!
Сравним две варианта:
cout << x++ << endl;
cout << ++x << endl;
Что происходит в первом случае? На консоль выводится значение х, а ЗАТЕМ к переменной применяется увеличение на единицу.
Что происходит во втором случае? СНАЧАЛА к х применяется операция увеличения, а затем это увеличенное значение х выводится на консоль.
Итак, когда вы играетесь со счетчиком в отдельной строке, разницы никакой. Когда же используете ++
и --
по ходу выполнения более сложного выражения, надо учитывать, какую форму использовать, предваряющую или заключающую, то есть префиксную или постфиксную.
Кстати, на С++ само название языка может стать выражением:
int c = 1;
c++;
На сегодня всё.
PayPal: peter.semiletov@gmail.com
биткоин: 1PCo2zznEGMFJey4qFKGQ8CoFK2nzNnJJf