Ранее мы с вами
говорили как можно объявлять переменные. На этом занятии рассмотрим
арифметические операции в Java. Они следующие:
Операция
|
Описание
|
Приоритет
|
+
|
сложение
|
1
|
-
|
вычитание
|
1
|
*
|
умножение
|
3
|
/
|
деление
|
3
|
%
|
остаток от деления
|
3
|
++
|
операция
инкремента (увеличение на 1)
|
4
|
--
|
операция
декремента (уменьшение на 1)
|
4
|
Начнем со
сложения и допустим необходимо вычислить сумму двух переменных:
или так:
то есть складывать можно как переменные,
так и числа или их комбинации:
Вычитание выполняется аналогично,
например:
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. А если сделать так:
то целочисленная переменная c будет равна 25.
Теперь давайте напишем простую программу
вычисления периметра прямоугольника со сторонами a и b. Формула
периметра имеет вид:
Зададим две
вещественные переменные a и b:
позволим
пользователю ввести их значения:
Scanner in = new Scanner(System.in);
System.out.print("a = "); a = in.nextDouble();
System.out.print("b = "); b = in.nextDouble();
вычислим периметр:
и выведем
результат на экран:
Запустим и посмотрим как это работает. Обратите
внимание, здесь мы при вычислении периметра использовали круглые скобки,
которые говорят о том, что сначала должно выполняется сложение, а только потом
– умножение. То есть, круглые скобки меняют приоритет арифметических операций и
все, что в них записано вычисляется в первую очередь так, как и принято в
математике.
Теперь операция деления. Например, можно
записать:
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? Для этого
достаточно одну из них привести к вещественному типу, например, так:
или так:
в обоих случаях результат будет 3,5.
Если же выполняется деление конкретных чисел, то можно записать их следующим
образом:
float d = 7/2; // результат 3
float d2 = 7.0f/2; //результат 3,5
Здесь во втором случае число 7.0
воспринимается как вещественное, поэтому и результат 3,5. Вот так работает
деление в Java.
Следующая арифметическая операция
вычисления остатка от деления двух целочисленных величин записывается так:
В результате переменная ost будет равна 1,
так как 3 входит в 10 ровно 3 раза и остается еще 1. Это и есть остаток от
деления. Данная операция выполняется только с целочисленными переменными или
целыми числами, то есть, вещественные значения записывать сюда нельзя.
Последние две операции, которые очень
часто используются в Java – это операции ++ и --. Первая операция
(операция инкремента) увеличивает значение переменной на 1, например, так:
Результат эквивалентен записи вида:
Но первый вариант проще в записи и
быстрее выполняется, так как компилятор его преобразует в более «быстрый»
байт-код.
Вторая операция декремента, наоборот,
уменьшает значение переменной на 1:
В результате arg будет равен 4.
Обратите внимание, что обе эти операции можно записать и в таком виде:
В данном случае результаты их работы
будут идентичны. Но различия здесь все же есть. Продемонстрируем их на таком
примере.
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. По итогам
этого занятия вы должны знать как работает оператор присваивания и как
выполняются арифметические операции.