Операции присваивания и приоритет операций



В завершении рассмотрим операции присваивания, которые в основном представляют комбинацию простого присваивания с другими операциями:

· =

просто приравнивает одно значение другому: c=b;

· +=

c+=b; (переменной c присваивается результат сложения c и b)

· -=

c-=b; (переменной c присваивается результат вычитания b из c)

· *=

c*=b; (переменной c присваивается результат произведения c и b)

· /=

c/=b; (переменной c присваивается результат деления c на b)

· %=

c%=b; (переменной c присваивается остаток от деления c на b)

· &=

c&=b; (переменной c присваивается значение c&b)

· |=

c|=b; (переменной c присваивается значение c|b)

· ^=

c^=b; (переменной c присваивается значение c^b)

· <<=

c<<=b; (переменной c присваивается значение c<<b)

· >>=

c>>=b; (переменной c присваивается значение c>>b)

· >>>=

c>>>=b; (переменной c присваивается значение c>>>b)

Примеры операций:

1 2 3 4 5 6 7 8 int a = 5; a += 10; // 15 a -= 3; // 12 a *= 2; // 24 a /= 6; // 4 a <<= 4; // 64 a >>= 2; // 16 System.out.println(a); // 16

Приоритет операций

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

expr++ expr--
++expr --expr +expr -expr ~ !
* / %
+ -
<< >> >>>
< > <= >= instanceof
== !=
&
^
|
&&
||
? : (тернарный оператор)
= += -= *= /= %= &= ^= |= <<= >>= >>>= (операторы присваивания)

Чем выше оператор в этой таблице, тем больше его приоритет. При этом скобки повышают приоритет операции, используемой в выражении.

Преобразования базовых типов данных

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

1 2 int a = 4; byte b = a; // ! Ошибка

В данном коде мы столкнемся с ошибкой. Хотя и тип byte, и тип int представляют целые числа. Более того значение переменной a, которое присваивается переменной типа byte, вполне укладывается в диапазон значений для типа byte (от -128 до 127). Тем не менее мы сталкиваемся с ошибкой на этапе компиляции. Поскольку в данном случае мы пытаемся присвоить некоторые данные, которые занимают 4 байта, переменной, которая занимет всего один байт.

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

1 2 3 int a = 4; byte b = (byte)a; // преобразование типов: от типа int к типу byte System.out.println(b); // 4

Операция преобразования типов предполагает указание в скобках того типа, к которому надо преобразовать значение. Например, в случае операции (byte)a, идет преобразование данных типа int в тип byte. В итоге мы получим значение типа byte.

Явные и неявные преобразования

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

Автоматические преобразования

 

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

Автоматически без каких-либо проблем производятся расширяющие преобразования (widening) - они расширяют представление объекта в памяти. Например:

1 2 byte b = 7; int d = b; // преобразование от byte к int

В данном случае значение типа byte, которое занимает в памяти 1 байт, расширяется до типа int, которое занимает 4 байта.

Расширяющие автоматические преобразования представлены следующими цепочками:

byte -> short -> int -> long

int -> double

short -> float -> double

char -> int

Автоматические преобразования с потерей точности

Некоторые преобразования могут производиться автоматически между типами данных одинаковой разрядности или даже от типа данных с большей разрядностью к типа с меньшей разрядностью. Это следующие цепочки преобразований: int -> float, long -> float и long -> double произволятся без ошибок, но при преобразовании мы можем столкнуться с потерей информации.

Например:

1 2 3 int a = 2147483647; float b = a; // от типа int к типу float System.out.println(b); // 2.14748365E9

Явные преобразования

Во всех остальных преобразованиях примитивных типов явным образом применяется опрерация преобразования типов. Обычно это сужающие преобразования (narrowing) от типа с большей разрядностью к типу с меньшей разрядностью:


Дата добавления: 2019-02-22; просмотров: 241; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!