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

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




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
==  !=
&
^
|
&&
||
?:
->
=  +=  -=  *=  /=  %=  >>=  <<=  >>>=

 


Зв’язані теми