Перейти к содержанию

Программирование на языке Scala/Логические выражения

Материал из Викиверситета

Логические выражения - это выражения, которые содержат логические операторы и вычисляются в логическое значение true или false. Они используются для описания условий и логических отношений. Логические выражения позволяют принимать решения в зависимости от истинности или ложности своих параметров. Логические значения могут храниться в типе Boolean.

Логические операторы, примеры на основе значений

val a: Boolean = true
val b: Boolean = false
val c: Int = 10
val d: Int = 20
операторы описание примеры
== Равно c  ==  d результат операции false
! = Не равно c  ! =  d результат операции true
> Более c  >  d результат операции false
< Менее c  <  d результат операции true
> = Больше или равно c  > =  d результат операции false
<= Меньше или равно c  <=  b результат операции true
&& Сокращенное логическое И (AND) конъюнкция a  &&  b результат операции false
& Полное логическое И (AND) конъюнкция a  &  b результат операции false
|| Сокращенное логическое ИЛИ (OR) дизъюнкция a || b результат операции true
| Полное логическое ИЛИ (OR) дизъюнкция a | b результат операции true
! Логическое НЕ (Not) ! b результат операции true
^ Логическое исключающее ИЛИ (XOR) a ^ b результат операции true

Операции && и || — сокращенно вычисляемые: выражения, построенные с помощью этих операторов, вычисляются, только когда это имеет смысл. Иными словами, правая часть выражений с использованием && и || не будет вычисляться, если результат уже определился при вычислении левой части. Например, если левая часть выражения с методом && вычисляется в false, то результатом выражения, несомненно, будет false, поэтому правая часть не вычисляется. Аналогично этому, если левая часть выражения с методом || вычисляется в true, то результатом выражения, конечно же, будет true, поэтому правая часть не вычисляется.

val x: Boolean = 1 > 2
val y: Boolean = 2 > 1
val a = y || x //x не имеет смысла вычислять и он не вычисляется

Если правую часть нужно вычислить при любых условиях, то вместо показанных выше методов следует обратиться к методам & и |. Первый выполняет логическую операцию «И», а второй — операцию «ИЛИ», но при этом они не прибегают к сокращенному вычислению.

Таблица истинности дизъюнкции, Логическое ИЛИ
a b результат
false false false
false true true
true false true
true true true
Таблица истинности конъюнкции, Логическое И
a b результат
false false false
false true false
true false false
true true true
Таблица истинности отрицания,

Логическое НЕ !

a результат
false true
true false
Таблица истинности исключающего ИЛИ ^
a b результат
false false false
false true true
true false true
true true false

Логические выражения могут быть длинными как и любые другие выражения, и содержать в себе выражения с другими типами.

Пример:

((c - d) >= (d - c)) && a || b ^ (a || b)

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

Логические выражения можно преобразовывать в другие, более короткие логические выражения с тем же итоговым значением. Преобразования делаются программистом по законам алгебры логики. Однако следует по возможности придерживаться выразительности логического выражения, показывая изначальную бизнес логику операций. Это поможет вовремя заметить логические ошибки в выражении и в дальнейшем легко дорабатывать такие выражения, не пытаясь разгадать тонкости оптимизированного выражения.Оптимизация (сокращение или упрощение) выражений как правило наносят вред изначально понятным выражениям, и с точки зрения производительности вычислений вносят очень небольшой вклад, поэтому не стоит оптимизировать выражения с целью сделать их вычисления быстрее.

Логическая конструкция if

[править]

Конструкция if позволяет получить значение в зависимости от логического выражения. Это конструкция, может быть вложенной, и позволяет построить любую логику.

Конструкция if является выражением.

Логика конструкции:

if (логическое_выражение) 
  // выражение, если логическое выражение истинно
else 
  // выражение, если логическое выражение ложно

Пример:

val a = 5
val b = 10
val c = if (a > b)  
  a - b
else 
  b - a

Пример вложенной конструкции:

val a = 5
val b = 10
val c = if (a > b)  
  if ((a - b) > 0)
    a * b
  else 
    a + b
else 
  b - a

Пример реализации операции конъюнкции на конструкции if:

val a = true
val b = false
val c = if (a)  
  b
else 
  false

Домашнее задание:

[править]
  1. В учебном проекте создать файл Boolean.sc (Scala-Worksheet).
  2. Составите 10 логических выражений, используя операции и тип Boolean  и Int. Придумайте им говорящие названия. Предугадайте их значения и потом вычислите их программой.
  3. На основе созданных выражений создайте 3 составных выражений. Придумайте и к ним говорящие названия.