Математические и специальные операторы
Для выполнения основных математических действий в языке Java используются следующие операторы:
Оператор | Действие |
+ | Сложение двух значений |
- | Вычитание из одного значения другого |
* | Умножение двух значений |
Разумеется, операторы эти могут использоваться как с числовыми значениями, так и с переменными – и порядок выполнения действий в сложных выражениях точно соответствует порядку выполнения действий, принятому в математике.
Аналогичным образом используются и скобки – только в языке Java, в отличие от математики, для записи сложных выражений используются только круглые скобки.
Гораздо сложнее обстоит дело с, казалось бы, простым оператором деления – это действия в языке Java обозначается символом "наклонная черта" (/), а также символом "процент" (%). Нередко можно встретить такие определения: оператор деления (/) и оператор вычисления остатка (%). Как видите, действие деления оказывается очень "многоликим" и далеко не всегда и в самом деле является оператором деления; все зависит от того, с переменными (и значениями) какого типа он используется!
Эта "многоликость" является источником многочисленных ошибок – в тех, разумеется, случаях, когда при написании класса забывают о необходимости точно представлять, какое из действий, обозначаемых символом "наклонная черта" придется иметь дело.
Рассмотрим в качестве примера следующий фрагмент класса (программный блок, набор кодов – можно использовать разные термины):
int a=reader.nextInt();
int b=2;
int c=a/b;
System.out.println(c);
Этот фрагмент будет давать для одних данных "ожидаемые" результаты, а для некоторых – вроде бы "неожиданные".
· При введении с клавиатуры (для переменной а) значения 4 – на экран выводится значение 2.
· При введении с клавиатуры (для переменной а) значения 5 – на экран выводится тожезначение 2.
Все дело в том, что при использовании с переменными только типа "целое число" знак "наклонная черта" (/) является оператором "вычисление частного", а вовсе не оператором "деление".
А теперь изменим этот фрагмент так, чтобы он выглядел следующим образом:
double a=reader.nextInt();
double b=2;
double c=a/b;
System.out.println(c);
Оказывается, работа, то есть исполнение фрагмента становится заметно иным!
· При введении с клавиатуры (для переменной а) значения 4 – на экран выводится значение 2.0
· При введении с клавиатуры (для переменной а) значения 5 – на экран выводится значение 2.5
Все дело в том, что в этом случае знак "наклонная черта" (/) действительно является оператором "деление".
В случае же использование переменных и значений разных типов то, какое действие будет выполнять знак "наклонная черта" (/), будет зависеть от комбинации переменных и использования операторов приведения типов…
Как видите, один и тот же символ ("наклонная черта") при всех своих использованиях так или иначе связан с операцией деления (ведь вычисление частного производится тоже в результате деления), однако значения, которые получаются в результате его использования, могут численно отличаться друг от друга.
Все это просто необходимо иметь в виду каждый раз, когда вы собираетесь использовать этот знак – и заранее, еще до написания кодов, четко себе представлять, какой из результатов вы хотите получить: "настоящий результат деления" или "частное от деления".
Кроме того, в языке Java имеются специальные (дополнительные) операторы для выполнения математических действий.
Оператор | Действие | Пример и объяснение |
++ | Увеличение значения переменной на 1 | int х=reader.nextInt(); x++; Если х получил с клавиатуры значение 6, то после выполнения оператора ++ переменная будет иметь значение 7 |
-- | Уменьшение значения переменной на 1 | int х=reader.nextInt(); x--; Если х получил с клавиатуры значение 6, то после выполнения оператора -- переменная будет иметь значение 5 |
+= | Увеличение значения переменной на значение, записанное после знака = | int х=reader.nextInt(); x+=10; Если х получил с клавиатуры значение 6, то после выполнения оператора +=10 переменная будет иметь значение 16 |
-= | Уменьшение значения переменной на значение, записанное после знака = | int х=reader.nextInt(); x-=10; Если х получил с клавиатуры значение 16, то после выполнения оператора -=10 переменная будет иметь значение 6 |
*= | Увеличение значения переменной в число раз, равное значению, записанному после знака = | int х=reader.nextInt(); x*=10; Если х получил с клавиатуры значение 6, то после выполнения оператора *=10 переменная будет иметь значение 60 |
/= | Деление (или вычисление частного) значения переменной на значение, записанное после знака = | int х=reader.nextInt(); x/=10; Если х получил с клавиатуры значение 67, то после выполнения оператора /=10 переменная будет иметь значение 6 |
%= | Вычисление остатка при делении значения переменной на значение, записанное после знака = | int х=reader.nextInt(); x%=4; Если х получил с клавиатуры значение 6, то после выполнения оператора *=10 переменная будет иметь значение 2 |
Разумеется, все эти операции можно записать в ином, без специфики языка Java, виде:
· х++ можно записать как х=х+1;
· х-- можно записать как х=х-1;
· х+=10 можно записать как х=х+10;
· х-=10 можно записать как х=х-10;
· х*=10 можно записать как х=х*10;
Следует знать оба варианта, поскольку кроме умения писать собственные коды, надо уметь и понимать коды, написанные кем-то другим. Кроме того, каждый, разумеется, может сам для себя решить, какую из форм записи он предпочтет использовать.
И хотя любой оператор с присваиванием с точки зрения получаемого результата эквивалентен выполнению соответствующей операции с последующим присваиванием, но работает он обычно быстрее.
В самом общем виде типичная для языка Java "сокращенная" форма записи строится следующим образом:
Существует одна особенность, связанная с использованием этих специальных операторов для изменения значения не одной и той же переменной, а разных переменных. Особенность эта связана с тем, где записывается указание на изменение – до или после переменной (пользуясь профессиональной терминологией: префиксная или постфиксная форма записи).
Вид блока команд | Что выводится на экран? | Объяснение |
int a=6,b; b=a++; System.out.println(a+" & "+b); | 7 & 6 | Во второй строке переменная b сначала получает от переменной а значение 6 – и только потом значение переменной а увеличивается на 1 |
int a=6,b; b=++a; System.out.println(a+" "+b); | 7 & 7 | Во второй строке сначала значение переменной а увеличивается на 1, а только потом это увеличенное значение получает переменная b |
Иными словами:
· команда b=a++; эквивалента командам b=a; a=a+1;
· команда b=++a; эквивалента командам a=a+1; b=a;
Это означает, что в такого рода командах чрезвычайно важным является то, записаны ли специальные операторы языка Java до или после соответствующей переменной.
Раздел №7.
Вычисление частного и остатка
В одной из предыдущих тем мы уже рассматривали особенности работы в языке Java оператора, обозначаемого знаком "наклонная черта" (/). Там мы говорили о том, что этот знак может означать и операцию вычисления частного (при делении одного целого числа на другое), и операцию "истинного деления" (если используются переменные типа "десятичные дроби" – double или float).
В языке Java существует и оператор, который вычисляет математический остаток, который образуется при делении одного числа на другое. Обозначается этот оператор знаком "процент" (%).
Например, при выполнении следующего фрагмента класса (блока):
int a=7;
int b=5;
int c=a % b;
переменная с будет получать значение 2 – то есть остаток от деления 7 на 5.
Операторы / (вычисление частного) и % (вычисление остатка) связаны с несколькими чрезвычайно широкими группами задач, часть из которых происходят из "жизненной практики", а часть – из "хитрой математики".
К первой группе можно отнести, например такую задачу: "При выезде группы школьников на экскурсию администрация должна заказать нужное число автобусов. Напишите класс, который принимает с клавиатуры количество школьников, которые должны выехать на экскурсию, и определяет число автобусов, которые следует заказать. Известно, что в каждом автобусе имеется 40 мест для учеников".
Ко второй группе задач относятся такие, которые можно назвать "разложение целого числа на составляющие его числа или цифры". Это, например, такая задача: "Напишите класс, который принимает с клавиатуры целое трехзначное число и определяет, является ли произведение первой и последней его цифр (числа единиц и числа сотен) больше квадрата его средней цифры (числа десятков)".
Еще одна группа задач, в которых ключевым является определение остатка при делении, это те задачи, в которых требуется проверить, делится ли одно число на другое. Во всех этих случаях мы используем математическое правило "Число а делится на число b, если остаток при делении а на b равен нулю". А это означает необходимость вычисления остатка при делении, что и позволяет сделать оператор "процент" (%).
Для второй группы задач ("разложение целого числа на составляющее") особенно значение имеет использование степеней 10, то есть значений 10, 100, 1000, 10000 и так далее. Для пояснения приведем несколько конкретных числовых примеров.
Число | Частное от деления числа на… | Остаток от деления числа на… | ||||||||
При внимательном изучении таблицы можно сделать следующие общие выводы (они, собственно, понятны и из математики, просто мы сформулируем их в более "подходящем" для компьютерных наук виде):
· операция "вычисление частного при делении на 10" всегда "укорачивает" число на последнюю цифру;
· операция "вычисление частного при делении на 100" всегда "укорачивает" число на две последних цифры;
· операция "вычисление частного при делении на 1000" всегда "укорачивает" число на три последних цифры
· и так далее…
· операция "вычисление остатка при делении на 10" всегда "возвращает" одну последнюю цифру;
· операция "вычисление остатка при делении на 100" всегда "возвращает" две последних цифры;
· операция "вычисление остатка при делении на 1000" всегда "возвращает" три последних цифры;
· и так далее…
Разумеется, для выделения отдельной цифры из числа в большинстве случаев надо будет использовать комбинированные операции "вычисления частного" и "вычисления остатка".
В качество дополнительного материала приведем примеры использования этих операций применительно к двузначным, трехзначным и четырехзначным числам.