Арифметичні оператори

Java підтримує сім арифметичних операторів, які працюють з будь-якими числовими типами:

+ Складання

– Віднімання

* Множення

/ Ділення

% Залишок

Java також підтримує унарний мінус (-) для зміни знака числа Знак може бути змінений оператором такого вигляду:

val = -val

Крім того, є і унарний плюс – наприклад, +3 Унарний плюс включений для симетрії, без нього було б неможливо записувати константи виду +20

5151 Цілочисельна арифметика

Цілочисельна арифметика виконується з доповненням за модулем 2 – тобто при виході за межі свого діапазону допустимих значень (int або long) величина наводиться по модулю, рівному величині діапазону Таким чином, в целочисленной арифметиці ніколи не відбувається переповнення, зустрічаються лише виходи значення за межі діапазону

При целочисленном розподілі відбувається округлення у напрямку до нуля (тобто 7/2 дорівнює 3, а -7 / 2 одно -3) Розподіл і залишок для цілих типів підкоряються наступним правилом:

(x/y)*y + x%y == x

Отже, 7% 2 дорівнює 1, а -7% 2 дорівнює -1 Ділення на нуль або знаходження залишку від ділення на 0 в целочисленной арифметиці не допускається і призводить до запуску винятку ArithmeticException

Арифметичні операції з символами являють собою цілочисельні операції після неявного приведення char до типу int

5152 Арифметика із плаваючою крапкою

Для роботи з плаваючою точкою (як для представлення, так і для здійснення операцій) в Java використовується стандарт IEEE 7541985 Відповідно до нього допускаються як переповнення в бік нескінченності (Значення перевищує максимально

допустиме для double або float), так і виродження в нуль (значення стає занадто

малим і не відрізнятись від нуля для double або float) Також є спеціальне подання NaN (Not A Number, тобто «не-число) для результатів неприпустимих операцій – наприклад, ділення на нуль

Арифметичні операції з кінцевими операндами працюють відповідно до загальноприйнятих норм Знаки виразів з плаваючою точкою також підкоряються цим правилам множення двох чисел з однаковим знаком дає позитивний

результат, тоді як при перемножуванні двох чисел з різними знаками результат буде негативним

Складання двох бесконечностей з однаковим знаком дає нескінченність з тим же знаком Якщо знаки різняться – відповідь дорівнює NaN Віднімання бесконечностей з однаковим знаком дає NaN віднімання бесконечностей з різними знаками дає нескінченність, знак якої збігається зі знаком лівого операнда Наприклад, (- (-)) одно Результат будь-якої арифметичної операції, в якій бере участь величина NaN, також дорівнює NaN При переповненні виходить нескінченність з відповідним знаком, а при виродження – нуль з відповідним знаком У стандарті IEEE мається негативний нуль, який дорівнює +00, однак 1f/0f одно позитивної нескінченності, а 1f/-0f одно негативною нескінченності

Якщо -00 == 00, як же відрізнити негативний нуль, отриманий в результаті виродження, від позитивного Його слід використовувати у виразі, в якому бере участь знак, і перевірити результат Наприклад, якщо значення x одно негативного нулю, то вираз 1 / x дорівнюватиме негативною нескінченності, а якщо позитивного – то позитивної нескінченності

Операції з нескінченними виконуються за стандартними математичними правилами Додавання (або віднімання) кінцевого числа з будь нескінченністю також дає нескінченність Наприклад, (- + x) дає – для будь-якого кінцевого x

Нескінченність може бути отримана за рахунок відповідної арифметичної операції або використання імені нескінченності для обєктів типу float або double: POSITIVE_INFINITY або NEGATIVE_INFINITY Наприклад, DoubleNEGATIVE_INFINITY представляє значення негативної нескінченності для обєктів типу double

Множення нескінченності на нуль дає в результаті NaN Множення нескінченності на ненульове кінцеве число дає нескінченність з відповідним знаком

Ділення, а також поділ з залишком може давати нескінченність чи NaN, але ніколи не призводить до винятків У таблиці перераховані результати арифметичних операцій при різних значеннях операндів:

x

y

x/y

x%y

Кінцеве

±00

NaN

Кінцеве

±00

x

±00

±00

NaN

NaN

Кінцеве

NaN

NaN       NaN

У всіх інших відносинах знаходження залишку при діленні з плаваючою точкою відбувається аналогічно знаходженню целочисленного залишку Обчислення залишку методом MathIEEERemainder описано в розділі 148

5153 Арифметика із плаваючою точкою і стандарт

IEEE-754

Арифметика із плаваючою крапкою в мові Java являє собою підмножину стандарту IEEE-754-1985 Тим читачам, яким необхідно повне розуміння всіх повязаних з цим аспектів, слід звернутися до специфікації мови Java The Java Language Specification. Ось коротке зведення ключових відмінностей:

Непреривавшуюся арифметика: в Java відсутні будь-які винятки чи інші події, що сигналізують про виняткових станах в сенсі IEEE:

розподіл на нуль, переповнення, виродження або втрата точності У арифметиці

Java не передбачені які-небудь дії при появі значення NaN

Округлення: в арифметиці Java відбувається округлення до найближчого – неточний результат округляється до найближчого представимо значень при наявності двох однаково близьких значень перевага віддається тому, у якого молодший біт дорівнює 0 Це відповідає стандарту IEEE Однак при перетворенні числа з плаваючою точкою до цілого в Java відбувається округлення у напрямку до нуля Java не допускає обираних користувачем режимів округлення для обчислень з плаваючою крапкою: округлення вгору, вниз або у напрямку до нуля

Умовні операції: в арифметиці Java відсутні реляційні предикати, які б реалізовували поняття впорядкованості, за винятком = Проте всі можливі випадки, крім одного, можуть бути змодельовані програмістом з використанням існуючих операцій відносини і логічного заперечення Винятком є ​​відношення впорядковано, але не дорівнює, яке при необхідності може бути представлено у вигляді x y

Розширені формати: арифметика Java не підтримує жодних розширених форматів, за винятком того, що double може виступати в якості розширення формату з одинарною точністю Наявність інших розширених форматів не є вимогою стандарту

5154 Конкатенация строк

Оператор + може застосовуватися для конкатенації рядків Наведемо приклад:

String boo = &quotboo"

String cry = boo + &quothoo" cry += &quot!" Systemoutprintln(cry)

А ось як виглядає результат роботи:

boohoo

Оператор + також використовується для конкатенації обєктів типу String зі строковим поданням будь-якого примітивного типу або обєкта Наприклад, наступний фрагмент укладає рядок в лапки-ялинки (guillemet characters), які використовуються для цитування в багатьох європейських мовах:

public static String guillemete(String quote) {

return &quot’ + quote + &quot’;

}

Неявне перетворення примітивних типів і обєктів у рядки відбувається лише при використанні + або + = у виразах з рядками – і ніде більше Наприклад, методом, що викликається з параметром типу String, потрібно передавати саме String – ви не зможете передати обєкт або float і розраховувати на його неявне перетворення

516 Оператори збільшення і зменшення

Оператори + + і – застосовуються відповідно для збільшення і зменшення значень Вираз i + + еквівалентно i = i + 1, якщо не рахувати того, що в першому випадку i обчислюється всього один раз Наприклад, оператор

arr[where()]++

всього один раз викликає метод where і використовує результат в якості індексу масиву

З іншого боку, в операторі

arr[where()] = arr[where()] + 1

метод where буде викликатися двічі: один раз при обчисленні правостороннього індексу, а вдруге – при обчисленні лівостороннього індексу Якщо при кожному виклику where повертається нове значення, результат відрізнятиметься від наведеного вище виразу, в якому використаний оператор + +

Оператори збільшення і зменшення можуть бути або префіксними, Або постфіксними – Тобто стояти або до, або після свого операнда Якщо оператор стоїть перед операндом (префікс), то операція прирощення / зменшення виконується до повернення результату вирази Якщо ж оператор варто після (Постфікси), то операція виконується після використання результату Приклад:

class IncOrder {

public static void main(String[] args) {

int i = 16

Systemoutprintln(++i + &quot &quot + i++ + &quot &quot + i)

}

}

Результат роботи буде виглядати так:

17 17 18

Перше виведене значення дорівнює i після виконання префіксного прирощення до 17 друге значення одно i після цього приросту, але до виконання наступного, Постфіксний прирощення до 18 нарешті, значення i виводиться після його Постфіксний прирощення в середині оператора виводу

Операції збільшення і зменшення + + і – можуть застосовуватися до змінних типу char

для отримання наступного або попереднього символу в кодуванні Unicode

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*