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

Ранее мы с вами говорили как можно объявлять переменные. На этом занятии рассмотрим арифметические операции в Java. Они следующие:

Операция

Описание

Приоритет

+

сложение

1

-

вычитание

1

*

умножение

3

/

деление

3

%

остаток от деления

3

++

операция инкремента (увеличение на 1)

4

--

операция декремента (уменьшение на 1)

4

Начнем со сложения и допустим необходимо вычислить сумму двух переменных:

int a=5, b=7;
int c=a+b;

или так:

int c=5+7;

то есть складывать можно как переменные, так и числа или их комбинации:

short d = c+5+a+7;

Вычитание выполняется аналогично, например:

float a = 5.8f, b = 7.6f;
double c = a-b;
int d = (int )(a-b);
 
System.out.println(c);
System.out.println(d);

В последнем случае мы сначала вычитаем две вещественные переменные, получаем математический результат -1.8, затем, это число приводится к целочисленному (отбрасывается дробная часть) и -1 уже присваивается целочисленной переменной d.

Но смотрите что получается при выводе переменной c в консоль. Она не равна в точности -1.8. Там лишь приближенное значение. Да, в Java вещественные числа считаются приближенно, а не точно (впрочем, как и в большинстве языков программирования). И это следует иметь в виду.

При умножении все делается аналогично. Допустим, мы хотим умножить переменную a на 3. Это делается, например, так:

float a=8.6f;
double b = 3*a;

в результате переменная b будет примерно равна 25.8. А если сделать так:

int c = (int )(3*a);

то целочисленная переменная c будет равна 25.

Теперь давайте напишем простую программу вычисления периметра прямоугольника со сторонами a и b. Формула периметра имеет вид:

Зададим две вещественные переменные a и b:

double a, b;

позволим пользователю ввести их значения:

Scanner in = new Scanner(System.in);
 
System.out.print("a = "); a = in.nextDouble();
System.out.print("b = "); b = in.nextDouble();

вычислим периметр:

double p = 2*(a+b);

и выведем результат на экран:

System.out.println(p);

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

Теперь операция деления. Например, можно записать:

int a = 7;
float b = 2;
double c = a/b;
 
System.out.println(c);

Здесь вещественная переменная c будет равна 3.5. Однако, эта операция имеет один важный нюанс. Смотрите, если переписать программу во так:

int a = 7;
    int b = 2;
    double c = a/b;
 
    System.out.println(c);

то переменная c будет равна уже не 3.5, а 3. Почему так получилось? Дело в том, что здесь в делении участвуют две целочисленные переменные, поэтому когда выполняется их деление, то результат 7/2=3,5 сначала временно сохраняется в целочисленной ячейке памяти, то есть, туда помещается значение 3 и только потом это значение присваивается вещественной переменной c. Вот так это все работает. Но если хотя бы одна из двух переменных a или b будет вещественной, то результат деления сохраняется уже в вещественной ячейке памяти, и затем, присваивается переменной c. Поэтому в первом случае было 3,5, а во втором 3. Запомните этот момент! Здесь многие начинающие программисты совершают ошибку.

Как же разделить две целочисленные переменные, чтобы получить верный математический результат 3,5? Для этого достаточно одну из них привести к вещественному типу, например, так:

double c = (double)a/b;

или так:

double c = a/(double)b;

в обоих случаях результат будет 3,5. Если же выполняется деление конкретных чисел, то можно записать их следующим образом:

float d = 7/2;  // результат 3
float d2 = 7.0f/2; //результат 3,5

Здесь во втором случае число 7.0 воспринимается как вещественное, поэтому и результат 3,5. Вот так работает деление в Java.

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

int ost = 10 % 3;

В результате переменная ost будет равна 1, так как 3 входит в 10 ровно 3 раза и остается еще 1. Это и есть остаток от деления. Данная операция выполняется только с целочисленными переменными или целыми числами, то есть, вещественные значения записывать сюда нельзя.

Последние две операции, которые очень часто используются в Java – это операции ++ и --. Первая операция (операция инкремента) увеличивает значение переменной на 1, например, так:

short var = 0;
var++;

Результат эквивалентен записи вида:

var = var+1;

Но первый вариант проще в записи и быстрее выполняется, так как компилятор его преобразует в более «быстрый» байт-код.

Вторая операция декремента, наоборот, уменьшает значение переменной на 1:

float arg = 5;
arg--;

В результате arg будет равен 4. Обратите внимание, что обе эти операции можно записать и в таком виде:

++var;
--arg;

В данном случае результаты их работы будут идентичны. Но различия здесь все же есть. Продемонстрируем их на таком примере.

int a, b, c = 10, d = 10;
a = c++;
b = ++d;
 
System.out.println("a = "+a+", b = "+b+", c = "+c+", d = "+d);

В результате a=10, b=11, и c=d=11. Почему здесь a=10? Смотрите, когда используется постпрефиксная запись оператора инкремента, то сначала выполняется операция присваивания и только потом увеличение c на 1. В префиксной же записи, сначала d увеличивается на 1, а потом полученное значение присваивается переменной b. Отсюда и различия в значениях переменных a и b.

Также обратите внимание, что приоритет у операций ++ и -- выше, чем у операций умножения и деления, то есть, инкремент и декремент выполняются раньше * и /.

В заключение занятия посмотрите еще на вот такие операции:

a += 5; // увеличение a на 5
b -= 3; // уменьшение b на 3
c *= 2; // увеличение c в 2 раза
d /= 4; // уменьшение d в 4 раза

Разумеется, числа здесь можно ставить самые разные или же использовать переменные.

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