Операции языка Java
Большинство операций в Java аналогичны тем, которые применяются в других си-подобных языках. Есть унарные операции (выполняются над одним операндом), бинарные — над двумя операндами, а также тернарные — выполняются над тремя операндами. Операндом является переменная или значение (например, число), участвующее в операции. Рассмотрим все виды операций.
Арифметические операции
- + операция сложения двух чисел, например: z=x+y
- — операция вычитания двух чисел: z=x-y
- * операция умножения двух чисел: z=x*y
- / операция деления двух чисел: z=x/y
- % получение остатка от деления двух чисел: z=x%y
- ++ (префиксный инкремент) Предполагает увеличение переменной на единицу, например, z=++y (вначале значение переменной y увеличивается на 1, а затем ее значение присваивается переменной z)
- ++ (постфиксный инкремент) также, увеличение переменной на единицу, например, z=y++ (вначале значение переменной y присваивается переменной z, а потом значение переменной y увеличивается на 1)
- — (префиксный декремент) уменьшение переменной на единицу, например, z=—y (вначале значение переменной y уменьшается на 1, а потом ее значение присваивается переменной z)
- — (постфиксный декремент) z=y— (сначала значение переменной y присваивается переменной z, а затем значение переменной y уменьшается на 1)
Операцию сложения также можно применять к строкам, в этом случае происходит конкатенация строк:
Логические операции над числами
Логические операции над числами представляют поразрядные операции. В данном случае числа рассматриваются в двоичном представлении, например, 2 в двоичной системе равно 10 и имеет два разряда, число 7 — 111 и имеет три разряда.
- & (логическое умножение) Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:
- В первом случае у нас два числа 2 и 5. 2 в двоичном виде представляет число 010, а 5 — 101. Поразрядное умножение чисел (0*1, 1*0, 0*1) дает результат 000.Во втором случае у нас вместо двойки число 4, у которого в первом разряде 1, так же как и у числа 5, поэтому здесь результатом операции (1*1, 0*0, 0 *1) = 100 будет число 4 в десятичном формате.
- | (логическое сложение)Данная операция также производится по двоичным разрядам, но теперь возвращается единица, если хотя бы у одного числа в данном разряде имеется единица (операция «логическое ИЛИ»). Например:
^ (логическое исключающее ИЛИ)
Также эту операцию называют XOR, нередко ее применяют для простого шифрования:
- Здесь также производятся поразрядные операции. Если у нас значения текущего разряда у обоих чисел разные, то возвращается 1, иначе возвращается 0. Например, результатом выражения 9^5 будет число 12. А чтобы расшифровать число, мы применяем обратную операцию к результату.
- ~ (логическое отрицание)Поразрядная операция, инвертирующая все разряды числа: если значение разряда равно 1, то оно становится равным нулю, и наоборот.
Операции сдвига
- a
- a>>b — смещает число a вправо на b разрядов. Например, 16>>1 сдвигает число 16 (которое в двоичной системе 10000) на один разряд вправо, то есть в итоге получается 1000 или число 8 в десятичном представлении.
- a>>>b — в отличие от предыдущих типов сдвигов данная операция представляет беззнаковый сдвиг — сдвигает число a вправо на b разрядов. Например, выражение -8>>>2 будет равно 1073741822.
Таким образом, если исходное число, которое надо сдвинуть в ту или другую строну, делится на два, то фактически получается умножение или деление на два. Поэтому подобную операцию можно использовать вместо непосредственного умножения или деления на два, так как операция сдвига на аппаратном уровне менее дорогостоящая операция в отличие от операции деления или умножения.
Операции сравнения
В операциях сравнения сравниваются два операнда, и возвращается значение типа boolean — true , если выражение верно, и false , если выражение неверно.
- == данная операция сравнивает два операнда на равенство: c=a==b; c равно true , если a равно b, иначе c будет равно false
- != c=a!=b; (c равно true , если a не равно b, иначе c будет равно false )
- < c=a
- > c=a>b; (c равно true , если a больше b, иначе c будет равно false )
- >= c=a>=b; (c равно true , если a больше или равно b, иначе c будет равно false )
Кроме собственно операций сравнения в Java также определены логические операторы, которые возвращают значение типа boolean . Выше мы рассматривали поразрядные операции над числами. Теперь же рассмотрим эти же операторы при операциях над булевыми значениями:
- | c=a|b; (c равно true , если либо a, либо b (либо и a, и b) равны true , иначе c будет равно false )
- & c=a&b; (c равно true , если и a, и b равны true , иначе c будет равно false )
- ! c!=b; (c равно true , если b равно false , иначе c будет равно false )
- ^ c=a^b; (c равно true , если либо a, либо b (но не одновременно) равны true , иначе c будет равно false )
- || c=a||b; (c равно true , если либо a, либо b (либо и a, и b) равны true , иначе c будет равно false )
- && c=a&&b; (c равно true , если и a, и b равны true , иначе c будет равно false )
Здесь у нас две пары операций | и || (а также & и && ) выполняют похожие действия, однако же они не равнозначны.
Выражение c=a|b; будет вычислять сначала оба значения — a и b и на их основе выводить результат.
В выражении же c=a||b; вначале будет вычисляться значение a, и если оно равно true , то вычисление значения b уже смысла не имеет, так как у нас в любом случае уже c будет равно true . Значение b будет вычисляться только в том случае, если a равно false
То же самое касается пары операций &/&& . В выражении c=a&b; будут вычисляться оба значения — a и b.
В выражении же c=a&&b; сначала будет вычисляться значение a, и если оно равно false , то вычисление значения b уже не имеет смысла, так как значение c в любом случае равно false . Значение b будет вычисляться только в том случае, если a равно true
Таким образом, операции || и && более удобны в вычислениях, позволяя сократить время на вычисление значения выражения и тем самым повышая производительность. А операции | и & больше подходят для выполнения поразрядных операций над числами.
Приоритет операций Java
Во время выполнения операций можно задавать приоритет выполнения с помощью скобок (операции в скобках выполняются раньше). Если скобки отсутствуют, выполняются сначала более приоритетные операции. Ниже приведена таблица приоритета выполнения операций.
Оператор | Описание | Ассоциативность |
++, — | постинкремент, постдекремент | справа налево |
++, —, +, -, ~, ! | преинкремент, предекремент, унарный плюс, унарный минус, поразрядное дополнение, булево «не» | справа налево |
*, /, % | умножение, деление, остаток от деления | слева направо |
+, — | сложение, вычитание | слева направо |
>, >>> | сдвиг влево, сдвиг вправо, беззнаковый сдвиг вправо | слева направо |
, =, instanceof | меньше, больше, меньше или равно, больше или равно, сравнить тип | слева направо |
==, != | равно, не равно | слева направо |
& | битовое «и» | слева направо |
^ | исключающее «или» | слева направо |
| | битовое «или» | слева направо |
&& | логическое «и» | слева направо |
|| | логическое «или» | слева направо |
?: | тернарный оператор | слева направо |
=, +=, -=,*=, /=, %=, &=, ^=, |=, <>=, >>>= | операторы присваивания | справа налево |
Чем выше в таблице расположен оператор, тем больше у него приоритет. В выражении ++x+y*z сперва выполнится инкремент, затем умножение, затем сложение (выражение можно представить в виде (++x)+(y*z) ).
Operators
Now that you’ve learned how to declare and initialize variables, you probably want to know how to do something with them. Learning the operators of the Java programming language is a good place to start. Operators are special symbols that perform specific operations on one, two, or three operands, and then return a result.
As we explore the operators of the Java programming language, it may be helpful for you to know ahead of time which operators have the highest precedence. The operators in the following table are listed according to precedence order. The closer to the top of the table an operator appears, the higher its precedence. Operators with higher precedence are evaluated before operators with relatively lower precedence. Operators on the same line have equal precedence. When operators of equal precedence appear in the same expression, a rule must govern which is evaluated first. All binary operators except for the assignment operators are evaluated from left to right; assignment operators are evaluated right to left.
Operators | Precedence |
---|---|
postfix | expr++ expr— |
unary | ++expr —expr +expr —expr ~ ! |
multiplicative | * / % |
additive | + — |
shift | > >>> |
relational | < >= instanceof |
equality | == != |
bitwise AND | & |
bitwise exclusive OR | ^ |
bitwise inclusive OR | | |
logical AND | && |
logical OR | || |
ternary | ? : |
assignment | = += -= *= /= %= &= ^= |= <>= >>>= |
In general-purpose programming, certain operators tend to appear more frequently than others; for example, the assignment operator » = » is far more common than the unsigned right shift operator » >>> «. With that in mind, the following discussion focuses first on the operators that you’re most likely to use on a regular basis, and ends focusing on those that are less common. Each discussion is accompanied by sample code that you can compile and run. Studying its output will help reinforce what you’ve just learned.
Previous page: Questions and Exercises: Variables
Next page: Assignment, Arithmetic, and Unary Operators