Java: Композиция операций
Что делать, когда в одной строке нужно несколько операций сразу? Их записывают подряд, и Java обрабатывает выражение шаг за шагом по строгим правилам.
Возьмем пример из одних умножений:
System.out.println(2 * 4 * 5 * 10); // 400Чтобы понять, как считает Java, разберем выражение по шагам:
- сначала вычисляется
2 * 4, остается8 * 5 * 10 - затем
8 * 5, остается40 * 10 - последнее умножение дает
400
Так операции соединяются друг с другом, и из простых действий собираются все более сложные выражения.
А если операции разные
Пока операторы одинаковые, все идет слева направо. А что будет, если смешать умножение и сложение?
System.out.println(2 + 3 * 4);Получится 20 или 14? Ответ 14.
2 + 3 * 4
└─┬─┘
2 + 12
└──┬───┘
14У операций есть приоритет, как и в математике. Умножение выполняется раньше сложения. Поэтому сначала считается 3 * 4, и только потом прибавляется двойка. Порядок можно изменить скобками. В выражении (2 + 3) * 4 сначала сложат 2 + 3, а результат 5 умножат на 4, и выйдет 20.
То же правило работает с вычитанием:
System.out.println(10 - 2 * 3); // 4Сначала умножение 2 * 3, потом 10 - 6, итог 4.
Отрицательные числа внутри выражения
Когда в выражении есть унарный минус, он применяется к своему числу раньше остальных операций:
System.out.println(4 + -2); // 2
System.out.println(6 - -2); // 8Разберем второй пример. Сначала унарный минус превращает 2 в -2, дальше операция читается как 6 - (-2), и это дает 8. То же самое, что и 6 + 2.
Что нужно запомнить
- выражение может состоять из нескольких операций
- Java вычисляет их по шагам, слева направо и с учетом приоритета
- скобки позволяют явно задать порядок вычислений
Задание
Реализуйте программу, которая вычисляет значение выражения 8 / 2 + 5 - -3 / 2 и выводит результат на экран. Не вычисляйте ничего самостоятельно, ваша программа должна производить все вычисления сама.
10Обратите внимание, что интерпретатор производит арифметические вычисления в правильном порядке: сначала деление и умножение, потом сложение и вычитание. Иногда этот порядок нужно изменить — об этом следующий урок.
Также обратите внимание на то, что в java по умолчанию используется целочисленное деление, 3 / 2 будет 1.
Java: Композиция операций
Что делать, когда в одной строке нужно несколько операций сразу? Их записывают подряд, и Java обрабатывает выражение шаг за шагом по строгим правилам.
Возьмем пример из одних умножений:
System.out.println(2 * 4 * 5 * 10); // 400Чтобы понять, как считает Java, разберем выражение по шагам:
- сначала вычисляется
2 * 4, остается8 * 5 * 10 - затем
8 * 5, остается40 * 10 - последнее умножение дает
400
Так операции соединяются друг с другом, и из простых действий собираются все более сложные выражения.
А если операции разные
Пока операторы одинаковые, все идет слева направо. А что будет, если смешать умножение и сложение?
System.out.println(2 + 3 * 4);Получится 20 или 14? Ответ 14.
2 + 3 * 4
└─┬─┘
2 + 12
└──┬───┘
14У операций есть приоритет, как и в математике. Умножение выполняется раньше сложения. Поэтому сначала считается 3 * 4, и только потом прибавляется двойка. Порядок можно изменить скобками. В выражении (2 + 3) * 4 сначала сложат 2 + 3, а результат 5 умножат на 4, и выйдет 20.
То же правило работает с вычитанием:
System.out.println(10 - 2 * 3); // 4Сначала умножение 2 * 3, потом 10 - 6, итог 4.
Отрицательные числа внутри выражения
Когда в выражении есть унарный минус, он применяется к своему числу раньше остальных операций:
System.out.println(4 + -2); // 2
System.out.println(6 - -2); // 8Разберем второй пример. Сначала унарный минус превращает 2 в -2, дальше операция читается как 6 - (-2), и это дает 8. То же самое, что и 6 + 2.
Что нужно запомнить
- выражение может состоять из нескольких операций
- Java вычисляет их по шагам, слева направо и с учетом приоритета
- скобки позволяют явно задать порядок вычислений
Задание
Реализуйте программу, которая вычисляет значение выражения 8 / 2 + 5 - -3 / 2 и выводит результат на экран. Не вычисляйте ничего самостоятельно, ваша программа должна производить все вычисления сама.
10Обратите внимание, что интерпретатор производит арифметические вычисления в правильном порядке: сначала деление и умножение, потом сложение и вычитание. Иногда этот порядок нужно изменить — об этом следующий урок.
Также обратите внимание на то, что в java по умолчанию используется целочисленное деление, 3 / 2 будет 1.
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "10";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
