Уже завтра в OTUS скоро стартует новая профессиональная программа по подготовке к сертификации Oracle Java Programmer (OCAJP). Предлагаем вам посмотреть запись бесплатного Demo-урока «Типы данных Java: Идентификаторы и примитивы» и продолжаем публиковать серию статей Владислава Родина — руководителя группы разработки, преподавателя в МФТИ и foxminded.



Введение


Сертификация OCA (Oracle Certified Associate Java SE8 Programmer) предлагает ряд необычных заданий, проверяющих глубокое понимание принципов работы языка программирования Java. Целый блок посвящен выражениям, циклам и операторам. Про последние мы сегодня и поговорим.

Приоритет операторов


Оператор принимает на вход аргументы и возвращает некоторые значения. Выделяют унарные, бинарные и тернарные операторы. Например, !false — унарный, a + b — бинарный, а? : — является единственным оператором, принимающим на вход три аргумента.

Первое, что необходимо помнить, это приоритет выполнения операторов:

  1. Пост-унарные операторы: exception++ и exception--
  2. Пре-унарные операторы: ++exception и --exception
  3. Остальные унарные операторы: +, -, !
  4. Умножение, деление, взятие остатка: *, /, %
  5. Сложение и вычитание: +, -
  6. Операторы битового сдвига: <<, >>, >>>
  7. Операторы сравнения: <, >, <=, >=, instanceof
  8. Операторы равенства-неравенства: ==, !=
  9. Логические операторы: &, |, ^
  10. Short-circuit логические операторы: &&, ||
  11. Тернарный оператор: boolean expression? expression1: expres-
    sion2
  12. Операторы присваивания: =, +=, -=, *=, /=, %=, &=, ^=, !=, <<=, >>=, >>>=

Работа с унарными операторами


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

Операторы смены знака и логической инверсии


Оператор логической инверсии ! применяется только к переменным типа boolean и превращает значение из true в false и наоборот. Например:

boolean x = false;
System.out.println(x); // false
x = !x;
System.out.println(x); // true

Оператор смены знака - применяется только к числам и меняет знак на противоположный:

double x = 1.21;
System.out.println(x); // 1.21
x = -x;
System.out.println(x); // -1.21
x = -x;
System.out.println(x); // 1.21

Java в отличии от того же C четко разделяет целочисленные типы данных и boolean, в связи с чем применение оператора смены знака к boolean либо же применение оператора логической инверсии приводят к ошибкам компиляции:

int x = !5; // DOES NOT COMPILE
boolean y = -true; // DOES NOT COMPILE
boolean z = !0; // DOES NOT COMPILE

Операторы инкремента и декремента


Операторы инкремента ++ и декремента -- применяются к целочисленным переменным и обладают двумя вариациям: post-инкремент (декремент) и pre-инкремент (декремент), в коде i++ (i--) и ++i (--i) соответственно. Разница между вариациями в том, что ++i увеличивает переменную и возвращает новое значение, а i++ возвращает старое значение, а только затем увеличивает переменную. Разницу более наглядно можно увидеть в таком куске кода:

int counter = 0;
System.out.println(counter); // Outputs 0
System.out.println(++counter); // Outputs 1
System.out.println(counter); // Outputs 1
System.out.println(counter--); // Outputs 1
System.out.println(counter); // Outputs 0

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

Что будет выведено в результате выполнения данной программы?
int x = 3;
int y = ++x * 5 / x-- + --x;
System.out.println("x is " + x);
System.out.println("y is " + y);

Проблема заключается в том, что x меняется несколько раз в одной строке.

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

int y = 4 * 5 / x-- + --x; // x assigned value of 4
int y = 4 * 5 / 4 + --x; // x assigned value of 3
int y = 4 * 5 / 4 + 2; // x assigned value of 2

Как видите, применяются все обозначенные выше правила применения операторов. В результате выведено будет следующее:

x is 2
y is 7

Читать ещё