Разное

Java логическое или: Логические операторы Java ( исключающее ИЛИ / логическое ИЛИ)

Операторы отношения и логические операторы

Вы здесь: Главная >> Java-учебник >> Операторы отношения и логические операторы


Язык Java содержит полный комплект операторов отношения. Чтобы проверить равенство, следует использовать символы = =. Например, значение выражения 3 = = 7 равно false.
Для проверки неравенства используются символы ! = .
Так, значение выражения 3 != 7 равно true.

Кроме того, в языке Java есть обычные операторы < (меньше), > (больше), <= (меньше или равно) и => (больше или равно).

Java, как и язык C++, использует символы для обозначения логического оператора «и», а также символы | | для обозначения логического оператора «или» . Как обычно, знак восклицания означает логический оператор отрицания . Операторы && и | | вычисляются по сокращенной схеме, т.е. если в ходе вычисления выражения А && В выясняется, что подвыражение А ложно, то подвыражение В не вычисляется.
Напри­мер, в выражении
х != 0 && 1/х > х+у // Не делить на 0.

вторая часть никогда не вычисляется, если значение переменной х равно нулю.

Та­ким образом, подвыражение 1/х не вычисляется, если х равно нулю и деления на нуль не происходит.

Аналогично, если оказывается, что выражение А истинно, то значение выражения А | | В автоматически становится истинным, и вычислять выражение В нет необходимости.

В языке Java есть также тернарный оператор ? :, который иногда оказывается по­лезным. Выражение

условие ? e1 : е2

означает, что если условие истинно, то вычисляется выражение e1, а если ложно — е2.

Например, выражение
х < у ? х : у

вычисляет меньшее из чисел х и y.

Побитовые операторы

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

В язы­ке Java есть следующие побитовые операторы:
S («и») | {«или») ^ («исключающее или») ~(«не»)

Эти операторы работают с битами. Например, если n — это целое число, то выражение
int fourthBitFromRight = (n & 8) /8;
равно единице, если четвертый бит справа в двоичном представлении числа n равен единице, и нуль, если нет.

Используя оператор & с соответствующей степенью двой­ки, можно замаскировать все биты, кроме одного.

Операторы & и | применяются к булевским переменным и вычисляют булевские значения.
Эти операторы аналогичны операторам && и | |, за исключением того, что побитовые операторы не вычисляются по сокращенной схеме, т.е. перед вычислением результата вычисляются оба аргумента.

В языке Java есть также операторы >> и <<, сдвигающие битовое представление числа вправо или влево. Эти операторы часто оказываются удобными, если нужно по­строить битовое представление на основе маски: int fourthBitFromRight = (n s (1 « 3)) » 3;

В языке есть даже оператор >>>, заполняющий старшие разряды нулями, в то вре­мя как оператор » приписывает знаковый бит к старшим разрядам.

Оператора <« в языке Java нет.

Аргумент, стоящий в правой части операторов побитового сдвига, сокращается по модулю 32 (если левая часть является числом типа long, правая часть сокра­щается по модулю 64).

Например, значение выражения 1«35 эквивалентно вы­ражению 1 <<3, или 8.

В языках C/C++ не фиксируется, какой сдвиг выполняет оператор >> : арифмети­ческий (вплоть до знакового бита) или логический (заполняя свободные разряды нулями).
Разработчики средств реализации языка могут выбрать тот вариант, ко­торый покажется им более эффективным. Это значит, что оператор >> в языке C/C++ в действительности лишь определяет некое неотрицательное число.

Язык Java снимает эту неопределенность.

Сергей Владимирцев
28.01.2011

Основные операторы Java — Мегаобучалка

 

Все операторы Java можно разделить на четыре группы: арифметические, логиче­ские, побитовые и сравнения. Рассмотрим последовательно каждую группу опе­раторов. Начнем с арифметических. Эти операторы перечислены в табл. 1.2

 

Таблица 1.2. Арифметические операторы Java

 

Оператор Название Пояснение
+ Сложение Бинарный оператор. Результатом команды a+b являет­ся сумма значений переменных a и b
- Вычитание Бинарный оператор. Результатом команды a-b являет­ся разность значений переменных a и b
* Умножение Бинарный оператор. Результатом команды a*b являет­ся произведение значений переменных a и b
/ Деление Бинарный оператор. Результатом команды a/b являет­ся частное от деления значений переменных a и b. Для целочисленных операндов по умолчанию выполняется деление нацело
% Остаток Бинарный оператор. Результатом команды a%b яв­ляется остаток от целочисленного деления значений переменных a и b
+= Сложение (упро­щенная форма с присваиванием) Упрощенная форма оператора сложения с присваива­нием. Команда a+=b является эквивалентом команды a=a+b
-= Вычитание (упро­щенная форма с присваиванием)
Упрощенная форма оператора вычитания с присваива­нием. Команда a-=b является эквивалентом команды a=a-b
*= Умножение (упро­щенная форма с присваиванием) Упрощенная форма оператора умножения с присваи­ванием. Команда a*=b является эквивалентом команды a=a*b
/= Деление (упро­щенная форма с присваиванием) Упрощенная форма оператора деления с присваива­нием. Команда a/=b является эквивалентом команды a=a/b
%= Остаток (упро­щенная форма) Упрощенная форма оператора вычисления остатка с присваиванием. Команда a%=b является эквивален­том команды a=a%b
++ Инкремент Унарный оператор. Команда a++ (или ++a) является эквивалентом команды a=a+1
Декремент Унарный оператор. Команда a— (или —a) является эквивалентом команды a=a-1

 

Эти операторы имеют некоторые особенности. В первую очередь обращаем вни­мание на оператор деления /. Если операндами являются целые числа, в ка­честве значения возвращается результат целочисленного деления. Рассмотрим последовательность команд:

int a=5,b=2; double x=a/b;

В данном примере переменная x получает значение 2.0, а не 2.5, как можно было бы ожидать. Дело в том, что сначала вычисляется выражение a/b. Поскольку операнды целочисленные, выполняется целочисленное деление. И только по­сле этого полученное значение преобразуется к формату double и присваивается переменной x.

Для того чтобы при целочисленных операндах выполнялось обычное деление, перед выражением с оператором деления указывается в круглых скобках иден­тификатор типа double (или float).

Например, так:

int a=5,b=2;

double x=(double)a/b;

Теперь значение переменной x равно 2.5.

В Java, как и в С++, есть группа упрощенных арифметических операторов с присваиванием. Если op — один из операторов сложения, умножения, деления и вычисления остатка, то упрощенная форма этого оператора с присваиванием имеет вид op=. Это тоже бинарный оператор, как и оператор op, а команда вида x op=y является эквивалентом команды x=x op y.

Еще два исключительно полезных унарных оператора — операторы инкремента (++) и декремента (—). Действие оператора декремента сводится к увеличению на единицу значения операнда, а оператор декремента на единицу уменьшает операнд. Другими словами, команда x++ эквивалентна команде x=x+1, а команда x— эквивалентна команде x=x-1. У операторов инкремента и декремента есть не только представленная здесь постфиксная форма (оператор следует после опе­ранда: x++ или x—), но и префиксная (оператор располагается перед операндом: ++x или —x).

С точки зрения действия на операнд нет разницы в том, префикс­ная или постфиксная формы оператора использованы. Однако если выражение с оператором инкремента или декремента является частью более сложного вы­ражения, различие в префиксной и постфиксной формах операторов инкремента и декремента существует. Если использована префиксная форма оператора, сна­чала изменяется значение операнда, а уже после этого вычисляется выражение. Если использована постфиксная форма оператора, сначала вычисляется выраже­ние, а затем изменяется значение операнда. Рассмотрим небольшой пример:

int n,m;

n=10;

m=n++;

В этом случае после выполнения команд переменная n будет иметь значение 11, а переменная m — значение 10. На момент выполнения команды m=n++ значение переменной n равно 10. Поскольку в команде m=n++ использована постфиксная форма оператора инкремента, то сначала выполняется присваивание значения переменной m, а после этого значение переменной n увеличивается на единицу.

Иной результат выполнения следующих команд:

int n,m;

n=10;

m=++n;

Обе переменные (n и m) в этом случае имеют значение 11. Поскольку в команде m=++n использована префиксная форма инкремента, сначала на единицу увели­чивается значение переменной n, а после этого значение переменной n присваи­вается переменной m.

Следующую группу образуют логические операторы. Операндами логических операторов являются переменные и литералы типа boolean. Логические опера­торы Java перечислены в табл. 1.3.

 

Таблица 1.3. Логические операторы Java

Оператор Название Пояснение
& Логическое И Бинарный оператор. Результатом операции A&B явля­ется true, если значения обоих операндов равны true. В противном случае возвращается значение false
&& Сокращенное логическое И Бинарный оператор. Особенность оператора, по срав­нению с оператором &, состоит в том, что если значе­ние первого операнда равно false, то значение второго операнда не проверяется
| Логическое ИЛИ Бинарный оператор. B являет­ся true, если значение одного и только одного опе­ранда равно true. В противном случае возвращается значение false
!
Логическое отрицание
Унарный оператор. Результатом команды !A является true, если значение операнда A равно false. Если зна­чение операнда A равно true, результатом команды !A является значение false

 

Логические операторы обычно используются в качестве условий в условных операторах и операторах цикла.

В табл. 1.4 перечислены операторы сравнения, используемые в Java.

Таблица 1.4. Операторы сравнения Java

 

Оператор Название Пояснение
= = Равно Результатом операции A= =B является значения true, если операнды A и B имеют одинаковые значения. В противном случае значением является false
Оператор Название Пояснение
< Меньше Результатом операции A<B является значения true, если значение операнда A меньше значения операнда B.
В противном случае значением является false
<= Меньше или равно Результатом операции A<=B является значения true, если значение операнда A не больше значения операн­да B. В противном случае значением является false
> Больше Результатом операции A>B является значения true, если значение операнда A больше значения операнда B. В противном случае значением является false
>= Больше или равно Результатом операции A>=B является значения true, если значение операнда A не меньше значения опе­ранда B. В противном случае значением является false
! = Не равно Результатом операции A!=B является значения true, если операнды A и B имеют разные значения. В про­тивном случае значением является false

 

Операторы сравнения обычно используются совместно с логическими операто­рами.

Для понимания принципов работы поразрядных операторов необходимо иметь хотя бы элементарные познания о двоичном представлении чисел. Напомним читателю некоторые основные моменты.

В двоичном представлении позиционная запись числа содержит нули и еди­ницы.

Старший бит (самый первый слева) определяет знак числа. Для положитель­ных чисел старший бит равен нулю, для отрицательных — единице.

Перевод из двоичной системы счисления положительного числа с позицион­ной записью bnbn-1…b2b1b0 (bi могут принимать значения 0 или 1, старший бит для положительных чисел bn = 0) в десятичную выполняется так:

b020 + b121 + b222 +… + bn-12n-1 + bn2n .

Для перевода отрицательного двоичного числа в десятичное представление производится побитовое инвертирование кода (об операции побитового ин­вертирования — см. далее), полученное двоичное число переводится в деся­тичную систему, к нему прибавляется единица (и добавляется знак минус).

Для перевода отрицательного числа из десятичной в двоичную систему от модуля числа отнимают единицу, результат переводят в бинарный код и затем этот код инвертируют.

Умножение числа на два эквивалентно сдвигу влево на один бит позиционной записи числа (с заполнением первого бита нулем).

Побитовые операторы Java описаны в табл. 1.5.

 

 

Таблица 1.5. Побитовые операторы Java

Оператор Название Пояснение
& Побитовое И Бинарный оператор. Логическая операция И приме­няется к каждой паре битов операндов. Результатом является 1, если каждый из двух сравниваемых битов равен 1. В противном случае результат равен 0
| Побитовое ИЛИ Бинарный оператор. Логическая операция ИЛИ при­меняется к каждой паре битов операндов. Побитовое ИСКЛЮЧА­ЮЩЕЕ ИЛИ Бинарный оператор. Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ применяется к каждой паре битов операндов. Результатом является 1, если один и только один из двух сравниваемых битов равен 1. В противном случае результат равен 0
~ Побитовое отрицание Унарный оператор. Выполняется инверсия двоичного кода: 0 меняется на 1, а 1 меняется на 0
>> Сдвиг вправо Бинарный оператор. Результатом является число, получаемое сдвигом вправо в позиционном пред­ставлении первого операнда (слева от оператора) на количество битов, определяемых вторым операндом (справа от оператора). Исходное значение перво­го операнда при этом не меняется. Младшие биты теряются, а старшие заполняются дублированием знакового бита
<< Сдвиг влево Бинарный оператор. Результатом является число, получаемое сдвигом влево в позиционном представле­нии первого операнда (слева от оператора) на количе­ство битов, определяемых вторым операндом (справа от оператора). Исходное значение первого операнда при этом не меняется. Младшие биты заполняются нулями, а старшие теряются
>>> Беззнаковый сдвиг вправо Бинарный оператор. Результатом является число, по­лучаемое сдвигом вправо в позиционном представле­нии первого операнда (слева от оператора) на количе­ство битов, определяемых вторым операндом (справа от оператора). Исходное значение первого операнда при этом не меняется. Младшие биты теряются, а старшие заполняются нулями
&= Упрощенная форма побито­вого оператора & с присваиванием Команда вида A&=B является эквивалентом команды A=A&B
|= Упрощенная форма побито­вого оператора | с присваиванием Команда вида A|=B является эквивалентом команды A=A|B

 

 

Оператор Название Пояснение
^= Упрощенная форма побито-вого оператора ^ с присваиванием Команда вида A^=Bявляется эквивалентом команды A=A^B
>>= Упрощенная форма побитово-го оператора >> с присваиванием Команда вида A>>=Bявляется эквивалентом команды A=A>>B
<<= Упрощенная форма побитово-го оператора << с присваиванием Команда вида A<<=Bявляется эквивалентом команды A=A<<B
>>>= Упрощенная форма побитово-го оператора >>> с присваиванием Команда вида A>>>=Bявляется эквивалентом команды A=A>>>B

 

 

За редким исключением, побитовые операции используются в случаях, когда необходимо оптимизировать программу в отношении быстродействия.

Помимо перечисленных операторов, в Java есть единственный тернарный опе­ратор (у оператора три операнда). Формально оператор обозначается как ?:. Синтаксис вызова этого оператора следующий:

условие?значение_1:значение_2

Первым операндом указывается условие — выражение, возвращающее в качестве значения логическое значение. Если значение выражения-условия равно true, в качестве значения тернарным оператором возвращается значение_1. Если зна­чением выражения-условия является false, тернарным оператором в качестве значения возвращается значение_2.

Несколько замечаний по поводу оператора присваивания (оператор =). В Java оператор присваивания возвращает значение. Команда вида x=y выполняется следующим образом. Сначала вычисляется выражение y, после чего это выра­жение приводится к типу переменной x и затем записывается в эту переменную. Благодаря тому, что, в отличие от других операторов с равными приоритетами, присваивание выполняется справа налево, в Java допустимыми являются ко­манды вида x=y=z. В этом случае значение переменной z присваивается сначала переменной y, а затем значение переменной y присваивается переменной x.

Еще одно замечание касается упрощенных форм операторов с присваиванием, то есть операторов вида op=. Хотя утверждалось, что команда вида A op=B эк­вивалента команде A=A op B, это не совсем так. При выполнении команды вида A op=B сначала вычисляется выражение A op B, затем полученное значение при­водится к типу переменной A и только после этого присваивается переменной A. Поскольку приведение к типу переменной A выполняется, фактически, явно, а в команде A=A op B приведение типов неявное, может проявиться разница в использовании полной и упрощенной форм команд присваивания. Рассмо­трим простой пример:

byte a=10,b=20;

// Правильно:

a+=20;

// Неправильно:

a=a+b;

В данном случае команда a+=20 является корректной, а команда a=a+b — нет. В первом случае литерал 20 типа int «насильственно» приводится к типу byte в силу особенностей оператора +=. Во втором случае результат вычисления вы­ражения a+b автоматически расширяется до типа int, а автоматическое приведе­ние типа int к типу byte запрещено.

Напоследок приведем в табл. 1.6 данные о приоритете различных операторов в Java.

 

Таблица 1.6. Приоритеты операторов в Java

 

Приоритет Операторы
Круглые скобки ( ), квадратные скобки [ ] и оператор «точка»
Инкремент ++, декремент —, отрицания ~ и !
Умножение *, деление / и вычисление остатка %
Сложение + и вычитание -
Побитовые сдвиги >>, << и >>>
Больше >, больше или равно >=, меньше или равно <= и меньше <
Равно = = и неравно ! =
Побитовое И &
Побитовое исключающее ИЛИ ^
Побитовое ИЛИ |
Логическое И &&
Логические ИЛИ ||
Тернарный оператор ?:
Присваивание = и сокращенные формы операторов вида op=

 

Операторы равных приоритетов (за исключением присваивания) выполняются слева направо. В случаях когда возникают сомнения в приоритете операторов и последовательности вычисления выражений, рекомендуется использовать круглые скобки.

 

Примеры программ

Далее рассмотрим некоторые задачи, которые иллюстрируют возможности Java и специфику синтаксиса этого языка.

Логические и логические операторы короткого замыкания в Java на примере

  • Таблица логических и логических операторов Java
    • Логические операторы Java (короткое замыкание)
      • Логическое И (&&)
      • Логическое ИЛИ (||)
    • Булевы операторы Java (без короткого замыкания)
      • Логическое И (&)
      • Логическое ИЛИ (|) 9)
      • Логическое НЕ (!)
  • Ссылки

Таблица логических и логических операторов Java

Когда два или более реляционных выражения участвуют в операторе принятия решения, они объединяются логическими операторами. Логические операторы бывают двух видов: короткое замыкание и не короткое замыкание . Они оба работают с логическими значениями и оценивают логические значения. Операторы короткого замыкания называются логическими операторами, а операторы без короткого замыкания называются логическими операторами.

Оба оператора с коротким замыканием и без короткого замыкания выполняют логические операции над булевыми выражениями, но между их стилями работы есть разница — логические операторы короткого замыкания оценивают второе выражение только в том случае, если это необходимо. Например, если вы хотите выполнить логическое И между expr-1 и expr-2 и если expr-1 дает false , то независимо от того, что возвращает expr-2 ; окончательный результат будет false . В этом случае expr-2 ; если оставить невыполненным, это не повлияет на окончательный результат операции И. Это делает операцию быстрее. Наоборот, логическая операция без короткого замыкания выполняет все булевы выражения, данные для выполнения.

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

Таблица 5: Демонстрация: логические операторы Java
Операция Описание Тип
А и Б логическое И короткое замыкание
А || Б логическое ИЛИ короткое замыкание логическое исключающее ИЛИ
логический НЕ

Логические операторы короткого замыкания эффективны и безопасны в использовании, поэтому мы обычно не видим в программах не-короткое замыкание.

Логические операторы Java (короткое замыкание)

&& и || — это логические операторы Java, эти операторы также называются условными операторами. Они выполняют boolean над их двумя boolean операндами и получить результат boolean .

Логическое И (&&)

Логическое И выполняет логическую операцию И над своими операндами. Он оценивается как true тогда и только тогда, когда оба операнда логического И истинны. Если один или оба операнда равны false , он оценивается как false. Например:

 // Возвращает значение true, если оба сравнения верны
если (x < 10 && y > 3) ... 

Обратите внимание, что все логические и логические операторы, кроме унарного ! имеют более низкий приоритет, чем операторы сравнения. Таким образом, совершенно законно написать строку кода, подобную приведенной выше. Однако некоторые программисты предпочитают использовать круглые скобки, чтобы сделать порядок вычислений явным:

 если ((x < 10) && (y > 3)) ... 

Логический оператор И или условный оператор И называется оператором короткого замыкания, потому что он условно оценивает свой второй операнд. Если первый операнд оценивается как false, значение выражения равно false, независимо от значения второго операнда. Поэтому для повышения эффективности интерпретатор Java использует более короткий путь и пропускает второй операнд. Поскольку вычисление второго операнда не гарантируется, следует соблюдать осторожность при использовании этого оператора с выражениями, имеющими побочные эффекты. С другой стороны, условный характер этого оператора позволяет нам писать выражения Java, подобные следующим:

 если (данные != null && i



 

Логическое ИЛИ (||)

Логический оператор ИЛИ выполняет логическую операцию ИЛИ над двумя логическими операндами. Он оценивается как true , если один или оба его операнда равны true . Если оба операнда равны false , он оценивается как false . Как и оператор &&, || не всегда оценивает свой второй операнд. Если первый операнд равен true , значение выражения равно true , независимо от значения второго операнда. Таким образом, в этом случае оператор просто пропускает второй операнд.

Булевы операторы Java (без короткого замыкания)

Логическое И (&)

При использовании с логическими операндами оператор и ведет себя так же, как оператор && , за исключением того, что он всегда оценивает оба операнда, независимо от значения первого операнда. Однако этот оператор почти всегда используется как побитовый оператор с целочисленными операндами, и многие Java-программисты даже не признали бы его использование с логическими операндами допустимым кодом Java.

Логическое ИЛИ (|)

Этот оператор выполняет логическую операцию ИЛИ над двумя логическими операндами. Это как || , за исключением того, что он всегда оценивает оба операнда, даже если первый из них истинен. | Оператор почти всегда используется как побитовый оператор для целочисленных операндов; его использование с булевыми операндами очень редко. ) 9Оператор гораздо чаще используется в качестве побитового оператора для целочисленных операндов. С булевыми операндами этот оператор эквивалентен оператору != .

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

Булево ! — это унарный оператор, который изменяет логическое значение своего операнда. При применении к значению true оно оценивается как false , а если применяется к значению false , оно оценивается как верно . За ! — унарный оператор, он имеет высокий приоритет и часто должен использоваться со скобками. Это полезно в таких выражениях:

 if (!found) ... // найдено - логическая переменная, объявленная где-то

while (!c.isEmpty()) ... // isEmpty() возвращает логическое значение

если (!(х > у && у > г)) 

Последнее слово

В этом уроке мы обсудили булевы и логические операторы Java. Надеюсь, вам понравилось читать это руководство по логическим операторам. Пожалуйста, напишите нам, если у вас есть какие-либо предложения/комментарии или вы столкнетесь с какой-либо ошибкой на этой странице. Спасибо за чтение!

Каталожные номера

  1. Core Java, том I — основы
  2. Java: полный справочник, седьмое издание
  3. Операторы: руководство Sun
  4. Хитрости с битами


3.4 Булевы операторы

3.4 Булевы операторы
Точно так же, как над арифметическими выражениями можно воздействовать арифметическими операторами для создания новых арифметических выражений можно использовать логические выражения. логическими операторами для создания новых логических выражений. В Java обычно используются три логических оператора: ! (нет), && (и), и || (или же). В приложении G обсуждаются другие, менее часто используемые логические операторы. Если p и q имеют логический тип, то

1. !p (не p) имеет значение true тогда и только тогда, когда p имеет значение false.

2. p && q (p и q) имеет значение true тогда и только тогда, когда оба p и q имеют значение true.

3. п || q (p или q) имеет значение true тогда и только тогда, когда хотя бы одно из p или q имеет значение true. Результаты применения булевых операторов можно свести к истинам. таблицы , как показано ниже.


Обратите внимание, что таблица истинности для p || q имеет значение true не только в том случае, если ровно одно из них истинно, но также и в том случае, если оба p и q истинны. Это может поначалу кажется странным, но мы часто используем слово «или» именно в этом смысле. За Например, если вас спросят: «Вы пьете сливки или сахар с кофе?» Это разумно ответить: «Да, я беру оба». Прием «сливок или сахара» включает возможность взять оба.

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

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

Эти операторы можно смешивать в выражениях с другими операторами. Порядок старшинства для операторов, которые мы видели до сих пор, таков:

Операции с одинаковым приоритетом выполняются слева направо с исключением операций присваивания, которые (как мы уже видели) выполняется справа налево.

При вычислении выражений, включающих && или ||, в Java используется метод известный как ленивая оценка или оценка короткого замыкания или условная оценка . Чтобы показать, как это работает, рассмотрим выражение p && q. Оценка это слева направо, если p ложно, то все выражение должно быть ложным, независимо от того, какое значение имеет q. Так как значение выражения известно без оценки q Java даже не смотрит на q. Конечно, если p истинно, то Java должен проверить q, чтобы определить значение всего выражения.

Аналогичная ситуация возникает с выражениями вида p || кв. Здесь, если p истинно, то все выражение должно быть истинным, чтобы Java снова могла быть ленив и не утруждать себя просмотром q.


Логические выражения часто можно упростить с помощью пары известных правил. как законы де Моргана , в честь логика Августа де Моргана. К Чтобы проиллюстрировать один из этих законов, рассмотрим утверждение «Эта книга скучна». и этот курс бесполезен». Чтобы это утверждение было правдой, обе его части должно быть правдой. Чтобы утверждение было ложным, одна или обе его части должны быть ложными. Таким образом, отрицание этого утверждения можно записать в виде «Эта книга не скучна, и этот курс не бесполезен». Если мы позволим b представлять «Эта книга скучная», а u — «Эта книга конечно бесполезен», то из вышеприведенного аргумента утверждение «это не верно, что эта книга скучна, а этот курс бесполезен», можно было бы написать в качестве ! (б && у). С другой стороны, утверждение «эта книга не скучная». или этот курс не бесполезен» можно записать как !b || !u. Поскольку эти утверждения эквивалентны, то

Это один из законов де Моргана. Другой образуется путем замены позиции && и ||. В качестве примера второй формы можно привести высказывание «Я не люблю зеленые яйца или ветчину» означает «я не люблю зеленые яйца и я не люблю как ветчина.» Использование символа для обозначения двух логических выражений эквивалентно, мы можем записать два закона следующим образом:
  1. Оцените каждое выражение, предполагая, что следующие объявления были сделаны.
  2. Максимально упростить.


  3. Напишите логическое выражение, которое будет истинным тогда и только тогда, когда значение int переменная i удовлетворяет условию 0 i 5.
  4. Используйте законы де Моргана и тот факт, что !!p эквивалентно p для упростить каждое выражение.
  5. Помимо законов де Моргана, существует ряд других законов который можно использовать для упрощения логических выражений.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *