Унарные операторы в Java

от автора

Уже завтра в 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 

Читать ещё:

ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/524926/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *