Курс

"Программирование Java"

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

Использование основных арифимтечских и логических операций в Java и их приоритет в сложных выражениях

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

Большинство операций в Java аналогичны тем, которые применяются в других си-подобных языках. Есть унарные операции (выполняются над одним операндом), бинарные - над двумя операндами, а также тернарные - выполняются над тремя операндами. Операндом является переменная или значение (например, число), участвующее в операции. Рассмотрим все виды операций

В арифметических операциях участвуют числа. В Java есть бинарные арифметические операции (производятся над двумя операндами) и унарные (выполняются над одним операндом). К бинарным операциям относят следующие:

Операция сложения двух чисел «+»:

1 int a = 10;

2 int b = 7;

3 int c = a + b;  // 17 

4 int d = 4 + b;  // 11

Операция вычитания двух чисел «-»:

1 int a = 10;

2 int b = 7;

3 int c = a - b;  // 3

4 int d = 4 - a;  // -6

 

Операция умножения двух чисел «*»:

1 int a = 10;

2 int b = 7;

3 int c = a * b;  // 70

4 int d = b * 5;  // 35

 

Операция деления двух чисел «/»:

1 int a = 20;

2 int b = 5;

3 int c = a / b;  // 4

4 double d = 22.5 / 4.5;  // 5.0

При делении стоит учитывать, что если в операции участвуют два целых числа, то результат деления будет округляться до целого числа, даже если результат присваивается переменной float или double:

1 double k = 10 / 4;     // 2

2 System.out.println(k);

Чтобы результат представлял число с плавающей точкой, один из операндов также должен представлять число с плавающей точкой:

1

2

double k = 10.0 / 4;     // 2.5

System.out.println(k);

 

Получение остатка от деления двух чисел «%»:

1 int a = 33;

2 int b = 5;

3 int c = a % b;  // 3

4 int d = 22 % 4; // 2 (22 - 4*5 = 2)

Также есть две унарные арифметические операции, которые производятся над одним числом: ++ (инкремент) и -- (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная:

++ (префиксный инкремент)

Предполагает увеличение переменной на единицу, например, z=++y (вначале значение переменной y увеличивается на 1, а затем ее значение присваивается переменной z)

 

1 int a = 8;

2 int b = ++a;

3 System.out.println(a);  // 9

4 System.out.println(b);  // 9

 

++ (постфиксный инкремент)

Также представляет увеличение переменной на единицу, например, z=y++ (вначале значение переменной y присваивается переменной z, а потом значение переменной y увеличивается на 1)

1 int a = 8;

2 int b = a++;

3 System.out.println(a);  // 9

4 System.out.println(b);  // 8

 

-- (префиксный декремент)

уменьшение переменной на единицу, например, z=--y (вначале значение переменной y уменьшается на 1, а потом ее значение присваивается переменной z)

1 int a = 8;

2 int b = --a;

3 System.out.println(a);  // 7

4 System.out.println(b);  // 7

 

-- (постфиксный декремент)

z=y-- (сначала значение переменной y присваивается переменной z, а затем значение переменной y уменьшается на 1)

1

2

3

4

int a = 8;

int b = a--;

System.out.println(a);  // 7

System.out.println(b);  // 8

 

Комбинированные операции

Кроме того, в Java существуют так называемые комбинированные операции. В них используется комбинация из двух операций:

Присваивание

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

Сюда входят операции:

  • +=

  • -=

  • *=

  • /=

  • %=

x += y означает x = x + y. Просто для краткости записи используется два знака подряд. Так же это работает с комбинациями -=, *= , /= и %=.

Приоритет арифметических операций

Одни операции имеют больший приоритет, чем другие, и поэтому выполняются вначале. Операции в порядке уменьшения приоритета:

++ (инкремент), -- (декремент)

* (умножение), / (деление), % (остаток от деления)

+ (сложение), - (вычитание)

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

1

2

3

4

int a = 8;

int b = 7;

int c = a + 5 * ++b;      

System.out.println(c);  // 48

Вначале будет выполняться операция инкремента ++b, которая имеет больший приоритет - она увеличит значение переменной b и возвратит его в качестве результата. Затем выполняется умножение 5 * ++b, и только в последнюю очередь выполняется сложение a + 5 * ++b

Скобки позволяют переопределить порядок вычислений:

1

2

3

4

int a = 8;

int b = 7;

int c = (a + 5) * ++b;    

System.out.println(c);  // 104

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

Ассоциативность операций

Кроме приоритета операции отличаются таким понятием как ассоциативность. Когда операции имеют один и тот же приоритет, порядок вычисления определяется ассоциативностью операторов. В зависимости от ассоциативности есть два типа операторов:

Левоассоциативные операторы, которые выполняются слева направо

Правоассоциативные операторы, которые выполняются справа налево

Так, некоторые операции, например, операции умножения и деления, имеют один и тот же приоритет. Какой же тогда будет результат в выражении:

1

int x = 10 / 5 * 2;

Стоит нам трактовать это выражение как (10 / 5) * 2 или как 10 / (5 * 2)? Ведь в зависимости от трактовки мы получим разные результаты.

Все арифметические операторы (кроме префиксного инкремента и декремента) являются левоассоциативными, то есть выполняются слева направо. Поэтому выражение 10 / 5 * 2 необходимо трактовать как (10 / 5) * 2, то есть результатом будет 4.

Операции с числами с плавающей точкой

Следует отметить, что числа с плавающей точкой не подходят для финансовых и других вычислений, где ошибки при округлении могут быть критичными. Например:

1

2

double d = 2.0 - 1.1;

System.out.println(d);

В данном случае переменная d будет равна не 0.9, как можно было бы изначально предположить, а 0.8999999999999999. Подобные ошибки точности возникают из-за того, что на низком уровне для представления чисел с плавающей точкой применяется двоичная система, однако для числа 0.1 не существует двоичного представления, также как и для других дробных значений. Поэтому в таких случаях обычно применяется класс BigDecimal, который позволяет обойти подобные ситуации.

Операции сравнения

В Java (как и в математике) реализованы операции сравнения. 

  • равно (==)

  • больше (>)

  • меньше (<)

  • больше либо равно (>=)

  • меньше либо равно (<=)

  • не равно (!=)

1

2

3

boolean c = 10 <= 10;    // true

boolean b = 10 <= 4;     // false

boolean d = 10 <= 20;    // true

Здесь стоит обратить внимание на один важный момент, операция “равно” записывается как ==, а не одним знаком =. Результат операции сравнения либо true, либо false.

1

2

3

4

int a = 10;

int b = 4;

boolean c = a == b;         // false

boolean d = a == 10;       // true

Единичный знак = в Java является оператором присваивания, когда переменной присваивается число, строка, или значения другой переменной.

 

Логические операции

Дизъюнкция «||»

Если два высказывания А и В соединить союзом «ИЛИ», то получится новое высказывание, обозначаемое А ИЛИ В и называемое дизъюнкцией высказываний  и . Дизъюнкция А ИЛИ В – это высказывание истинное, если хотя бы одно из высказываний А и В истинно, и ложное, если А и В одновременно ложны. В java дизъюнкция обозначается «||»

Конъюнкция «&&» 

Если два высказывания А и В соединить союзом «И», то получится новое высказывание, обозначаемое и называемое конъюнкцией высказываний А и В. Конъюнкция А И В – это высказывание истинное, если А и В одновременно истинны, и ложное, если хотя бы одно из высказываний А и В ложно. В java конъюнкция обозначается «&&»

Отрицание «!»

Отрицанием высказывания А называется высказывание !А, которое истинно, если А ложно, и, наоборот, ложно, если А истинно.

1

 

2

boolean a1 = (5 > 6) || (4 < 6); // 5 > 6 - false, 

4 < 6 - true, поэтому возвращается true

boolean a2 = (5 > 6) || (4 > 6); // 5 > 6 - false, 

4 > 6 - false, поэтому возвращается false

 

Приложение

Выражения:

package com.company;

 

import java.util.Scanner;

 

public class Main {

 

    public static void main(String[] args) {

        //определение целочисленных переменных a и b

        int a, b;

 

        //определение сканера (необходим для считывания данных)

        Scanner sc = new Scanner(System.in);

 

        //присвоение считанных сканером значений в переменные a и b

        a = sc.nextInt();

        b = sc.nextInt();

 

        //сумма

        int c = a + b;

        System.out.println( c );

        //разность

        c = a - b;

        System.out.println( c );

        //умножение

        c = a * b;

        System.out.println( c );

        //деление (т.к. с - целочисленная переменная, то сохраняется только целая честь)

        c = a / b;

        System.out.println( c );

        //остаток от деления (пример: 89 % 10 = 9 (т.к. 89 = 10 * 8 + 9)

        c = a % b;

        System.out.println( c );

 

    }

 

 

}

 

Краткая запись:

import java.util.Scanner;

 

public class Main {

 

    public static void main(String[] args) {

 

        //Краткие записи выражений

        int a = 8, b = 5, c = 8;

 

        a++; // a = a + 1;

        System.out.println( a );

        ++a; // a = a + 1;

        System.out.println( a );

 

        b--; // b = b - 1;

        System.out.println( b );

        --b; // b = b - 1;

        System.out.println( b );

 

        c += a; // c = c + a;

        System.out.println( c );

        c -= b; // c = c - b;

        System.out.println( c );

        c *= b; // c = c * b;

        System.out.println( c );

        c /= a; // c = c / a

        System.out.println( c );

        c %= a; // c = c % a

        System.out.println( c );

 

        //степень

        int x = 5;

        System.out.println( Math.pow(x, 3) );

 

    }

 

}

Операции сравнения:

import java.util.Scanner;

 

public class Main {

 

    public static void main(String[] args) {

 

        //Операции сравнений

 

        // >, <, ==, !=, <=, >=

        Scanner in = new Scanner(System.in);

        int a = in.nextInt(), b = in.nextInt();

        boolean res;

 

        res = a > b;

        System.out.println( res );

        res = a < b;

        System.out.println( res );

        res = a <= b;

        System.out.println( res );

        res = a >= b;

        System.out.println( res );

        res = a == b;

        System.out.println( res );

        res = a != b;

        System.out.println( res );

        

 

 

 

    }

 

}

Полезный код