Перейти к содержимому

Как называются операторы and or not

  • автор:

Таблица операторов

Оператором называется знак или символ, указывающий на тип вычислений, которые выполняются в выражении. Существуют математические, логические операторы, а также операторы сравнения и ссылок. Access поддерживает различные операторы, включая арифметические операторы, такие как +, , умножение (*) и деление (/), а также операторы для сравнения значений, текстовые операторы для сцепления текста и логические операторы для определения значений «Истина» и «Ложь». Эта статья содержит сведения об использовании таких операторов.

В этой статье

  • Арифметические операторы
  • Операторы сравнения
  • Логические операторы
  • Операторы объединения
  • Специальные операторы

Арифметические операторы

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

Основные логические операции (and, or, xor, not)

Бит — это минимальная единица измерения объёма информации, так как она хранит одно из двух значений — 0 (False) или 1 (True). False и True в переводе на русский ложь и истина соответственно. То есть одна битовая ячейка может находиться одновременно лишь в одном состоянии из возможных двух. Напомню, два возможных состояния битовой ячейки равны — 1 и 0.
Есть определённые операции, для манипуляций с битами. Эти операции называются логическими или булевыми операциями, названные в честь одного из математиков — Джорджа Буля (1815-1864), который способствовал развитию этой области науки.
Все эти операции могут быть применены к любому биту, независимо от того, какое он имеет значение — 0(нуль) или 1(единицу). Ниже приведены основные логические операции и примеры их использования.

Логическая операция И (AND)

Логическая операция И выполняется с двумя битами, назовем их a и b. Результат выполнения логической операции И будет равен 1, если a и b равны 1, а во всех остальных (других) случаях, результат будет равен 0. Смотрим таблицу истинности логической операции and.

a(бит 1) b(бит 2) a(бит 1) & b(бит 2)
0 0 0
0 1 0
1 0 0
1 1 1

Логическая операция ИЛИ (OR)

Логическая операция ИЛИ выполняется с двумя битами (a и b). Результат выполнения логической операции ИЛИ будет равен 0, если a и b равны 0 (нулю), а во всех остальных (других) случаях, результат равен 1 (единице). Смотрим таблицу истинности логической операции OR.

a(бит 1) b(бит 2) a(бит 1) | b(бит 2)
0 0 0
0 1 1
1 0 1
1 1 1

Логическая операция исключающее ИЛИ (XOR).

Обозначение XOR: ^
Логическая операция исключающее ИЛИ выполняется с двумя битами (a и b). Результат выполнения логической операции XOR будет равен 1 (единице), если один из битов a или b равен 1 (единице), во всех остальных случаях, результат равен 0 (нулю). Смотрим таблицу истинности логической операции исключающее ИЛИ.

a(бит 1) b(бит 2) a(бит 1) ^ b(бит 2)
0 0 0
0 1 1
1 0 1
1 1 0

Логическая операция НЕ (not)

Обозначение NOT: ~
Логическая операция НЕ выполняется с одним битом. Результат выполнения этой логической операции напрямую зависит от состояния бита. Если бит находился в нулевом состоянии, то результат выполнения NOT будет равен единице и наоборот. Смотрим таблицу истинности логической операции НЕ.

a(бит 1) ~a(отрицание бита)
0 1
1 0

Запомните эти 4 логические операции. Используя эти логические операции, мы можем получить любой возможный результат. Подробно об использовании логических операций в С++ читаем тут.

Логические операторы в Java

Знакомимся с каждым, узнаём про короткую и полную схемы вычислений. Проводим побитовые операции с целыми числами. Всё закрепляем на примерах.

Артём Авдеев

Артём Авдеев
Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.

Логические операции в Java возвращают значение типа boolean: true или false («правда» или «ложь»). Подробнее о булевом типе мы говорили здесь.

В языке Java есть шесть логических операторов. Первые четыре представлены в таблице ниже.

Логический оператор Обозначение в Java Выражение Результат
«И» (AND): конъюнкция, логическое умножение && true && true

Где нужны логические операторы

Если коротко, то в условных выражениях, которые могут включать в себя и операторы сравнения (, >, , >=, ==, !=). При вычислении они возвращают значение булева типа.

Условные выражения, в свою очередь, применяются в операторах ветвления (if-else, switch, тернарном). Подробнее об этих операторах тут.

Как применять

Допустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор && (И).

Логический оператор && (И) возвращает true, если слева и справа от него стоят значения true, а иначе — false.

Иными словами, если оба логических высказывания истинны, то и операция && (И) возвращает истину.

int a = 6; int b = 3; int c = 4; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> true

Как вычисляется значение выражения (a > b) && (a > c):

Сначала проверяется условие (a > b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие (a > c), которое также вернёт true, ведь 6 больше 3.

Теперь у нас с двух сторон от логического оператора && стоят значения true.

По определению выше или по таблице ещё выше, результат вычисления логического выражения (true && true) равен true.

int a = 6; int b = 4; int c = 7; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false

Результат операции (a > b) вернёт true, так как 6 больше 4, а операция (a > c) уже вернёт false, так как 6 не больше 7.

Значит, слева от логического оператора && стоит true, а справа — false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false.

int a = 4; int b = 5; int c = 6; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false

Результат операции сравнения (a > b) равен false, а что вернёт операция (a > c), уже значения не имеет (смотрите определение выше) — результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false.

Рассмотрим примеры с другими операторами.

OR

int a = 4; int b = 6; int c = 3; boolean d = (a > b) || (a > c); System.out.println(d); --OUTPUT> true

Значение переменной d равно true.

int a = 9; int b = 9; boolean c = a > b || a != b; System.out.println(c); --OUTPUT> false

Теперь вычисляйте вы.

XOR

int a = 5; int b = 6; int c = 7; boolean d = (b > a) ^ (c > a); System.out.println(d); --OUTPUT> false

Значение d равно false.

NOT

int a = 5; int b = 9; boolean d = !(a > b); System.out.println(d); --OUTPUT> true

Значение d стало true.

Полные и сокращённые версии AND и OR

&& и || называются сокращёнными логическими операторами AND и OR соответственно, или операторами короткой схемы вычислений. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.

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

В чём разница

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

То есть иногда результат выражения однозначно определён уже по первому операнду:

  • Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.
  • Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true.

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

Как использовать

&& и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?

Начнём с оператора &&. Приведём фрагмент из таблицы выше:

Логический оператор Обозначение в Java Выражение Результат
«И» (AND): конъюнкция, логическое умножение && true && true

Рассмотрим выражение: (3 > 4) AND (5 > 4)

Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше — и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.

Именно по такой логике и работает оператор короткой схемы вычислений &&. Если выражение слева от него равно false, то выражение справа вычисляться не будет.

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

В большинстве случае применяют именно && и ||. При верном использовании они избавляют Java от ненужных вычислений и страхуют от некоторых ошибок.

int a = 3; int b = 0; boolean d = (b != 0) && (a/b > 0); System.out.println(d); --OUTPUT> false

Если вместо оператора && мы используем &, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:

int a = 3; int b = 0; boolean d = (b != 0) & (a/b > 0); System.out.println(d); —OUTPUT> Exception in thread java.lang.ArithmeticException: / by zero at

Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.

Иными словами, мы узнали, что b равно 0 (выражение b != 0 вернуло false) — и идём делить на b (делить на ноль), вычисляя значение второго операнда (a/b > 0).

public void printStringLengthMoreThenZero(String str) < if (str != null && str.length() > 0) < System.out.println(str.length()); >else < System.out.println("Тут нечего считать!"); > >

Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: «Тут нечего считать!»

Мы выбрали оператор короткой схемы вычислений && — и это правильно!

А вот если бы вместо этого использовали оператор полной схемы &, то наш код работал бы не так, как надо.

Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.

Посмотрим, что происходило бы при вычислении условия блока if:

  • str != null & str.length() > 0
  • null != null & str.length() > 0
  • false & str.length() > 0 // тут возникает ошибка

Сперва вычисляется первый аргумент логического выражения, а именно str != null (иными словами, получаем ответ на вопрос «Строковая переменная не равна null?»). Получили false, значит всё же равна.

Дальше Java должна вычислить второй аргумент логического выражения, а именно str.length() > 0 (иными словами — проверяется «Число символов строки > 0?»).

Для этого вызывается метод str.length(), который должен вернуть целое значение. Оно и будет сравниваться с 0. Но у нас-то str равна null (возвращать методу нечего, строки нет). Тут Java и пожалуется на NullPointerException.

Порядок выполнения операторов

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

Если одинаковые операции стоят по соседству, то раньше выполняется та, что левее.

boolean a = true ^ true & false; System.out.println(a);

Вычислим true ^ true & false:

  • Выбираем самый приоритетный оператор (если таких больше одного — тот, что левее). У нас самый приоритетный & (он здесь такой один).
  • Смотрим, что слева и справа от него: это true и false соответственно.
  • Вычисляем выражение true & false — получаем false.
  • В исходном выражении заменяем true & false результатом его вычисления (false) — и получаем: true ^ false.
  • Вычислив это выражение, получаем результат true.
boolean a = true ^ true && false; System.out.println(a);

Теперь самый приоритетный оператор в выражении это ^ — и порядок вычислений будет уже другой:

Результат будет false.

Как изменить порядок вычисления

Порядок вычисления логических операторов меняют круглые скобки — так же, как в арифметике:

boolean a = (true ^ true) & false; System.out.println(a); --OUTPUT> false

Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение (true ^ true), которое вернёт false. А после — вычислится выражение false & false, которое тоже вернёт false.

То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.

Пример посложнее — выражение !(true && (false || true)) ^ !false.

Как логические операторы работают с целыми числами

Мы уже знаем, что логические операции применимы к логическим аргументам (операндам). Каждый логический операнд — это выражение, которое является истинным (true) или ложным (false) — то есть возвращает булево значение. Иными словами, логический операнд — это выражение типа boolean.

Выходит, применять логические операторы к целочисленным аргументам нельзя?

Можно. Внутри Java все целочисленные типы представлены двоичными числами разной длины. И к ним уже применимы бинарные логические операторы ^, | и &.

Только в этом случае они работают с двоичным представлением операндов — выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и & зовутся побитовыми.

Как ^, | и & работают с целочисленными операндами

int a = 3 & 5; int b = 3 | 5; int c = 3 ^ 5; System.out.println(a); System.out.println(b); System.out.println(c); --OUTPUT> 1 --OUTPUT> 7 --OUTPUT> 6

Чтобы повторить вычисления Java, нужно:

  • Перевести значения обоих операндов в двоичную систему счисления.
  • Расположить результаты перевода друг под другом.
  • Сравнять в них число разрядов (дополнить лидирующими нулями).
  • Применить к битам из каждого столбца оператор (&, | или ^).
  • Записать результат каждой операции ниже в том же столбце.
  • Перевести итог в десятичную форму.

Потренируемся: вычислим сами 3 & 5

Число 3 в двоичной системе счисления имеет вид 11, а число 5 — 101.

Так как у числа 5 три разряда в двоичной системе, а у числа 3 — всего два, добавим лидирующий ноль к числу 3 в двоичной системе и получим 011.

Берём цифры из обоих чисел и применяем к ним попарно оператор & (AND):

3(10) = 011(2) 0 1 1
& & &
5(10) = 101(2) 1 0 1
= = =
001(2) = 1(10) 0 0 1

Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 & 5 и возвращает в результате 1.

Вычислим 3 | 5

С оператором | действуем так же:

3(10) = 011(2) 0 1 1
| | |
5(10) = 101(2) 1 0 1
= = =
111(2) = 7(10) 1 1 1

Условный оператор

Проверьте истинность второго отношения при подстановке следующих значений:

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

Примечание. Название “булевы” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булеву логику и алгебру логики.

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

К:=True;
Flag:=False;
Second:=a+sqr(x)>t

Задача. Вычислить значение модуля и квадратного корня из выражения (х-у).

Для решения этой задачи нужны уже знакомые нам стандартные функции нахождения квадратного корня — Sqr и модуля — Abs. Поэтому Вы уже можете записать следующие операторы присваивания:

Koren:=Sqrt(x-y);
Modul:=Abs(x-y)

В этом случае программа будет иметь вид:

Program Znachenia;
Uses
Crt;
Var
x, y : integer;
Koren, Modul : real;
Begin
ClrScr;
write (‘Введите значения переменных х и у через пробел ‘);
readln (x, y);
Koren:=Sqrt(x-y);
Modul:=Abs(x-y);
write (‘Значение квадратного корня из выражения (х-у) равно ‘, Koren);
write (‘Значение модуля выражения (х-у) равно ‘, Modul);
readln;
End.

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

Поэтому наша программа имеет свою допустимую область исходных данных. Найдем эту область. Для этого запишем неравенство х-у>=0, то есть х>=у. Значит, если пользователем нашей программы будут введены такие числа, что при подстановке значение этого неравенства будет равно True, то квадратный корень из выражения (х-у) извлечь можно. А если значение неравенства будет равно False, то выполнение программы закончится аварийно.

Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод.

  1. х=23, у=5;
  2. х=-5, у=15;
  3. х=8, у=8.

Каждая программа, насколько это возможно, должна осуществлять контроль за допустимостью величин, участвующих в вычислениях. Здесь мы сталкиваемся с разветвлением нашего алгоритма в зависимости от условия. Для реализации таких условных переходов в языке Паскаль используют операторы If и Case, а также оператор безусловного перехода Goto.

Рассмотрим оператор If.

Для нашей задачи нужно выполнить следующий алгоритм:

если х>=у,
то вычислить значение квадратного корня,
иначе выдать на экран сообщение об ошибочном введении данных.

Запишем его с помощью оператора If. Это будет выглядеть так.

if x>=y
then
Koren:=Sqr(x-y)
else
write (‘Введены недопустимые значения переменных’);

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

В общем случае полная форма конструкции условного оператора имеет вид:

Условный оператор работает по следующему алгоритму.

Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется , расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь, то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется .

Управляющая структура if может показаться негибкой, так как выполняемые действия могут быть описаны только одним оператором. Иногда может потребоваться выполнение последовательности операторов. В этом случае хотелось бы заключить всю последовательность в воображаемые скобки. В Паскале предусмотрен этот случай.

Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin . End называется составным оператором.

if
then
begin
оператор 1;
оператор 2;
.
end
else
begin
оператор 1;
оператор 2;
.
end;

Определение. Составной оператор — объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end).

begin
оператор 1;
оператор 2;
end;

С учетом полученных знаний преобразуем нашу программу.

Program Znachenia;
Uses
Crt;
Var
x, y : integer;
Koren, Modul : real;
Begin
ClrScr;
write (‘Введите значения переменных х и у через пробел ‘);
read (x, y);
if x>=y
then
begin
Koren:=Sqr(x-y);
Modul:=Abs(x-y);
write (‘Значение квадратного корня из выражения (х-у) равно ‘, Koren);
write (‘Значение модуля выражения (х-у) равно ‘, Modul);
end
else
write (‘Введены недопустимые значения переменных’);
readln;
End.

Составным оператором является и такой оператор

begin
S:=0;
end.

Cимвол “;” в данном случае разделяет оператор присваивания S:=0 и пустой оператор.

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

Например, составной оператор

включает лишь один пустой оператор.

Если Вы обратили внимание, программа на языке Паскаль всегда содержит один составной оператор — раздел операторов программы.

Внимание! Перед служебным словом Else разделитель (точка с запятой) не ставится.

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

    Каждое описание переменной и определение константы заканчиваются точкой с запятой.

Рассмотрим еще один пример.

Задача. Вывести на экран большее из двух данных чисел.

Program Example1;
Var
x, y : integer;
Begin
writeln(‘Введите 2 числа ‘);
readln(x,y);
if x>y
then
writeln (x)
else
writeln (y);
readln;
End.

Можно также использовать и сокращенную (неполную) форму записи условного оператора. Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо.

Неполная форма условного оператора имеет следующий вид.

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

Задача. Составить программу, которая, если введенное число отрицательное, меняет его на противоположное.

Program Chisla;
Var
x : integer;
Begin
writeln(‘Введите число ‘);
readln(x);
if x then
x:=-x;
writeln (x);
readln;
End.

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

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