Представьте, что мы хотим вычислить абсолютное значение числа.
Это число без знака.
Предположим, что abs, является функцией, которая вычисляет абсолютное значение.
Таким образом, abs 3 равна 3, а abs -3 также равно 3.
Давайте определим проблему более формально.
Если условие x больше 0 вычисляется как true, тогда вычисление abs x совпадает с вычислением x.
Если условие x больше 0 вычисляется как false, тогда вычисление abs x – это то же самое, что и вычисление значения минус x.
Теперь мы хотели бы написать выражение, которое вычисляет абсолютное значение.
Мы бы решили проблему, если бы у нас была функция f с тремя аргументами.
Первый аргумент – это условие.
Второй аргумент – это выражение для вычисления в случае true.
И третий аргумент – это выражение для вычисления в случае false.
В Java эта функция существует, называется она тернарный оператор, и имеет определенный синтаксис.
Здесь используется знак вопроса между условием и выражением для случая true и двоеточие между выражением для случая true и выражением для случая false.
В этом примере, если условие истинно, оператор выдает 1.
Если условие ложно, оператор выдает 2.
Основным типом данных в условных выражениях является тип boolean, который имеет два значения: true и false.
Но существуют ли в наших условных выражениях if else только два возможных случая?
Представьте, что вы плохо запрограммировали логическое выражение, тогда это приведет к вычислению, которое не может завершиться.
В этом случае, если вычисление логического выражения не завершается, вся программа не будет завершена.
Поэтому, на самом деле, у нас есть три случая, это true, false и undefined.
В дальнейшем, анализируя сегменты кода, мы также должны учитывать это неопределенное значение.
Для логических выражений это означает, что у нас есть три возможных случая – true, false и undefined.
И это отличается от традиционной математики, где мы обычно имеем только истину и ложь.
Теперь, давайте немного вспомним о возможностях, которые мы видели.
Здесь, слева, у нас есть условное утверждение, где, в зависимости от значения булевой переменной b, мы присваиваем m или n переменной x.
С другой стороны, у нас есть тройной оператор, который позволяет писать логические выражения.
Оба сегмента кода эквивалентны.
Теперь рассмотрим этот пример.
Представьте, что у нас есть булево значение b и что выражение сравнивает b с true.
Это может быть явно упрощено до b, так как если b истинно, b == true, вычисляется как true.
И если b является ложным, b == true, вычисляется как false.
И если b не определено, выражение b == true также не определено.
Так почему бы не написать более простую версию, просто b как условие?
Аналогично вы можете поступить, если мы имеем выражение b == false.
Вы можете выбрать более простую версию, не b.
И еще вы можете написать b как условие, и поменять операторы S1 и S2.
Здесь у нас есть другое выражение.
Давайте проанализируем его.
Здесь, если b не определено, результат не определен.
Если b истинно, результат будет истинным.
И если b является ложным, результат будет ложным.
Мы рассмотрели все возможные значения b и всего выражения
И мы видим, что они имеют одинаковые значения, что они эквивалентны.
Поэтому вместо всего этого выражения мы можем написать только b.
Та же самая ситуация будет с выражением не b.
Теперь, давайте посмотрим выражение b? c: false.
Если b не определено, все выражение не определено.
Если b истинно, результат равен c.
Однако, если b является ложным, результат будет ложным.
Результат будет истина, только если b и с истина, во всех других случаях результат будет ложным.
Это эквивалентно логическому оператору и.
И наоборот, выражение b? true: c эквивалентно логическому оператору или.