Операция присваивания ‘=’. Тернарная операция ?:. Приоритет операций

Операция присваивания ‘=‘. Тернарная операция ?:. Приоритет операций




1. Какое назначение операции присваивания? Примеры

Операция присваивания обозначается символом ‘=’.

Операция присваивания есть одной из наиболее используемых в программах. Операция присваивания предназначенная для присваивания значения переменной.

Общий вид операции присваивания:

переменная = выражение;

Операция присваивания работает следующим образом: сначала вычисляется значение выражения в правой части, потом это значение присваивается переменной, которая размещается в левой части от знака ‘=‘.

При присваивании тип переменной и выражения должны быть совместимыми. Подробно о приведении типов в выражениях описывается здесь.

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

переменная1 = переменная2 = выражение;

В этом случае алгоритм выполнения следующий:

  • сначала вычисляется значение выражения;
  • результат вычисления выражения присваивается в переменную2;
  • результат вычисления выражения присваивается в переменную1.

Цепочка (последовательность) из операций присваивания может содержать произвольное количество присваиваний.

Пример применения операции присваивания.

// операция присваивания
int a;
double x, y, z;

x = -5.88; 
y = z = x; // y = -5.88, z = -5.88
x = y = z = 3.9; // x = 3.9, y = 3.9, z = 3.9

// присвоение и приведение типов
x = -8.6;
a = (int)x; // a = -8
y = a; // y = -8.0

char c = 'T';
int code = (int)c; // code = 84 - код символа 'T'

// логический тип
boolean b;
b = false && true; // b = false

2. Какой общий вид имеет тернарная операция ‘?:‘ ?

Тернарная операция ?: заменяет конструкцию

если ... то ... иначе

Общая форма операции

выражение1 ? выражение2 : выражение3

В вышеприведенной форме выражение1 – любое логическое выражение (boolean), результатом которого есть значение true или false. Если значение выражения выражение1 равно true, то вычисляется выражение2, в противном случае вычисляется выражение3.

3. Примеры использования тернарной операции ? :

Пример 1. Использование тернарной операции ?: для поиска максимума между двумя числами. Фрагмент программного кода.

// тернарная операция ?:
double a, b;
double max; // максимум

// ввод значений a, b
// ...

// поиск максимума между двумя числами
max = a>b ? a : b;

Пример 2. Использование тернарной операции ?: для поиска максимального значения между тремя числами a, b, c.

// тернарная операция ?:
double a, b, c;
double max; // максимум

// ввод значений a, b, c
// ...

// поиск максимума между тремя числами
max = a>b ? a : b;
max = max>c ? max : c;

4. Как работает операция присваивания для объектов? Пример

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

При присваивании примитивных типов происходит простое копирование с одного места памяти (правая часть оператора присваивания) в другое место (левая часть). Если написать

int x, y;
y = 5;
x = y;

то при выполнении

x = y;

значение 5, указанное в переменной y будет скопировано в переменную x. После этого, изменение значения в одной переменной не повлияет на значение в другой переменной, потому что переменные примитивных типов x, y размещены в разных участках памяти.

В случае присваивания объектов, присваиваются сами ссылки на объекты, а не внутренние данные этих объектов. То есть, после присваивания, эти ссылки будут указывать на один и тот же участок памяти (в отличие от присваивания переменных примитивных типов).

Пример. Пусть задан класс A, в котором определены одна внутренняя переменная a и конструктор класса

class A {
    int a;

    // конструктор класса
    A() {
        a = 10;            
    }     
}

Ниже демонстрируется результат после выполнения операции присваивания

// объявление и выделение памяти для объектов класса A
A obj1 = new A();
A obj2 = new A();
int d;

// проверка работы конструктора
d = obj1.a; // d = 10
d = obj2.a; // d = 10

// установление новых, различных значений
obj1.a = 30;
obj2.a = 28;

// до выполнения присваивания
d = obj1.a; // d = 30
d = obj2.a; // d = 28

// присваивание объектов
obj2 = obj1;

// после присваивания obj1 и obj2 ссылаются на общий участок памяти (obj1)
d = obj1.a; // d = 30
d = obj2.a; // d = 30

// изменение значения в одном из объектов
obj2.a = 77;

// доступ по другой ссылке (obj2) - одно и то же значение
d = obj1.a; // d = 77

Как видно из вышеприведенного кода, после присваивания объектов, эти объекты ссылаются на один и тот же участок памяти. В данном случае, это участок памяти выделенный для объекта obj1. Участок памяти, который был выделен для объекта obj2 после операции присваивания теряется бесповоротно. Позже этот участок будет очищен «сборщиком мусора».

После выполнения присваивания, изменение данных в объекте obj1 будет приводить к изменению данных в obj2, так как эти ссылки указывают на один и тот же участок памяти.

5. Таблица приоритетов операций
Приоритет операций в порядке убывания
--------------------------------------------------------------
++ -- (постфиксные)
++ -- (префиксные) ~ ! +(унарный) -(унарный) (приведение типов)
*   /   %
+   -
>>  >>>  <<
>   >=   <    <=    instanceof
==  !=
&
^
|
&&
||
?:
->
=  +=  -=  *=  /=  %=  >>=  <<=  >>>=


Связанные темы