Другими словами, целочисленное деление всегда возвращает целое число путем усечения без округления.
При этом может быть потеряна информация, когда десятичная часть отсекается.
Например, при делении 2 на 3 результат должен быть 0.66, но мы получаем 0 из-за отсечения.
Или 3 делим на 2 и получаем 1 вместо 1.5.
Если вы делите double на double, результат будет double, как и ожидалось.
Теперь вопрос, как Java оперирует со смешанными делениями, включающими целые числа и числа с плавающей запятой?
В общем, деление double дает double.
Когда целое делится на double или double делится на целое, результатом будет double.
Это позволяет программе максимально сохранить информацию.
Например, если 2 делится на 3.0, результатом будет 0.6666 вместо 0.
Также, деление 3.0 на 2 даст результат 1.5.
Деление двух double 10.0 и 2.0 даст результат double 5.0.
Когда выражение вычисляется, мы должны определить порядок для выполнения операций, если в выражении больше одного оператора.
Когда мы изучали алгебру, мы узнали, что операции * умножения и / деления выполняются перед операциями + сложения и – вычитания, и такое же правило действует и в Java.
Например, в выражении m*x + b, m умножается на x перед прибавлением b к результату умножения.
Приоритет операторов задает порядок, в котором различные операторы выражения вычисляются.
Здесь показан стандартный порядок, которому следует Java:
( )
* / %
– +
Выражение, заключенное в круглые скобки, вычисляется первым.
Для вложенных скобок внутреннее выражение вычисляется первым.
Операторы * умножения, / деления и % остатка вычисляются вторыми, и, если их несколько, вычисление идет слева направо.
Операторы сложения и вычитания вычисляются после остальных операторов, и, если их несколько, вычисление идет слева направо.
Другая важная вещь в вычислении выражений, это концепция ассоциативности.
Ассоциативность используется для определения порядка, в котором операторы с одинаковым приоритетом вычисляются в выражении.
Правило ассоциации в этом примере, – это вычисление слева направо, и называется левой ассоциативностью.
При этом круглые скобки могут быть вставлены для усиления порядка вычисления.
Вы можете подумать, что все операции должны следовать левой ассоциации.
Однако это не всегда случается в Java, и мы уже видели оператор, который следует правой ассоциации, – это оператор присваивания =.
Вопросы
Задача
Что является результатом каждого из следующих выражений?
Expression X: 3 % 4 – 10 * 5
Expression Y: 5 + 11 / 2 * 2.0
Expression Z: 100 / 0
Варианты:
1.
X: -47
Y: 10.0
Z: 0
2.
X: 1
Y: 10.0
Z: 0
3.
X: -47
Y: 15.0
Z: ERROR
4.
X: -47
Y: 10.0
Z: ERROR
Ответ: 3.
Присваивание
Мы видели много выражений со знаком равенства в предыдущих примерах.
Все они использовали оператор присваивания.
Синтаксис оператора присваивания представляет собой размещение переменной на левой стороне знака равенства, выражения на его правой стороне и точки с запятой в конце.
Смысл или семантика оператора присваивания – это присвоить значение, вычисленное выражением на правой стороне, переменной на левой стороне, и исходное значение, хранимое в переменной, будет заменено.
Это обозначение может быть немного запутанным, поскольку в большинстве утверждений присваивания, левая сторона может быть не равна правой стороне в математическом смысле.
Например, вы можете иметь что-то вроде, а = а + 1;
Это не корректно в качестве математического выражения, но это верное утверждение присваивания.
Переменная здесь имеет начальное значение 1, и ее значение будет изменено на 2 после присвоения.
Для определенного типа существует набор действительных операторов, которые могут быть применены к этому типу.