Логические операторы в C
Логические операторы выполняют операции логического И ( && ) и логического ИЛИ ( || ).
Синтаксис
logical-AND-expression :
inclusive-OR-expression
logical-AND-expression && inclusive-OR-expression
logical-OR-expression :
logical-AND-expression
logical-OR-expression || logical-AND-expression
Комментарии
Логические операторы не выполняют обычных арифметических преобразований. Вместо этого они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является либо 0, либо 1. Результат имеет тип int .
Логические операторы C описываются ниже.
| Оператор | Описание |
|---|---|
| && | Логический оператор И создает значение 1, если оба операнда имеют ненулевое значение. Если любой из операндов имеет значение 0, результат равен 0. Если первый операнд операции логического И имеет значение 0, то второй операнд не вычисляется. |
| || | Оператор логического ИЛИ выполняет над своими операндами операцию включающего ИЛИ. Если оба операнда имеют значение 0, результат будет равен 0. Если любой из операндов имеет ненулевое значение, результат будет равен 1. Если первый операнд операции логического ИЛИ имеет ненулевое значение, то второй операнд не вычисляется. |
Операнды выражений логического И и логического ИЛИ вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется. Это называется сокращенным вычислением. После первого операнда в выражении есть точка последовательности. Дополнительные сведения см. в статье Точки следования C.
Примеры
В следующем примере показано использование логических операторов.
int w, x, y, z; if ( x < y && y < z ) printf( "x is less than z\n" );
printf( "%d" , (x == w || x == y || x == z) );
В этом примере, если x равно w , y или z , то второй аргумент функции printf имеет значение true и код выводит значение 1. В противном случае он возвращает значение false и код выводит значение 0. Как только обнаруживается, что одно из значений равно true, вычисление прекращается.
См. также
- Логический оператор И: &&
- Логический оператор ИЛИ: ||
§ 4. Логические операции И и ИЛИ
![]()
Логика высказываний позволяет строить составные высказывания. Они создаются из нескольких простых высказываний путем соединения их друг с другом с помощью логических операций НЕ, И, ИЛИ и др.
4.1. Логическая операция И
Определение истинности или ложности составного высказывания зависит от того, являются ли истинными или ложными простые высказывания, входящие в его состав, а также от той логической операции, которая их связывает.
Составное высказывание А И В, образованное в результате объединения двух простых высказываний А и B логической операцией И, истинно тогда и только тогда, когда А и В одновременно истинны (пример 4.1 и пример 4.2).
Операцию И называют логическим умножением. Равенства 1 · 1 = 1, 1 · 0 = 0, 0 · 1 = 0, 0 · 0 = 0, верные для обычного умножения, верны и для логического умножения.
Представим таблицу истинности для логической операции И:
А И В
Если хотя бы одно из простых высказываний, связанных операцией И, будет ложным, то и составное высказывание будет ложным.
Для записи логической операции И используют следующие обозначения: A И B, A AND B, A · B, A * B, A ∧ B, A & B.
4.2. Логическая операция ИЛИ
Составное высказывание А ИЛИ В, образованное в результате объединения двух простых высказываний А и B логической операцией ИЛИ, ложно тогда и только тогда, когда А и В одновременно ложны (пример 4.3).
Другими словами, составное высказывание А ИЛИ В будет истинным, если истинно хотя бы одно из двух составляющих его простых высказываний (пример 4.4).
Таблица истинности для логической операции ИЛИ имеет следующий вид:
Операцию ИЛИ называют логическим сложением. Равенства 1 + 0 = 1, 0 + 1 = 1, 0 + 0 = 0, верные для обычного сложения, верны и для логического сложения.
Для записи логической операции ИЛИ можно использовать следующие выражения: A ИЛИ B, A OR B, A + B, A ∨ B, A | B.
Если в логическом выражении присутствует несколько логических операций, то важно определить порядок их выполнения. Наивысшим приоритетом обладает операция НЕ. Логическая операция И, т. е. логическое умножение, выполняется раньше операции ИЛИ — логического сложения (пример 4.5* и пример 4.6*).
Для изменения порядка выполнения логических операций используют скобки: в этом случае сначала выполняются операции в скобках, а затем — все остальные.
Логические операции И и ИЛИ подчиняются переместительному закону:
A И B = B И A ;
A ИЛИ B = B ИЛИ A .
Чтобы определить значение составного логического выражения, иногда достаточно знать значение только одного простого высказывания.
Так, если в составном высказывании с операцией И значение хотя бы одного простого высказывания является ложным, то и значение составного высказывания будет ложным. Если в составном высказывании с операцией ИЛИ значение хотя бы одного простого будет истинным, то и значение составного высказывания будет истинным (пример 4.7).
Данное высказывание является составным, поскольку оно содержит два простых высказывания:
«Число 456 трехзначное» (высказывание А) и «Число 456 четное» (высказывание В). Высказывания А и В соединены вместе логической операцией И, в результате получено составное высказывание А И B. Высказывание А истинно, высказывание В истинно. Поэтому высказывание А И B истинно: (А И B) = 1.
Пример 4.2. Высказывание А: «Геракл — герой древнегреческой мифологии». Истинно, А = 1.
Высказывание В: «Геракл — сын бога Зевса». Истинно, B = 1.
Высказывание А И В: «Геракл — герой древнегреческой мифологии И сын бога Зевса». Истинно, (А И В) = 1.
Пример 4.3. Проанализируем высказывание «Семиклас-сники изучают философию или астрономию».
Данное составное высказывание образовано из двух простых высказываний: «Семиклассники изучают философию» (высказывание А), «Семиклас-сники изучают астрономию» (высказывание В), которые связаны логической операцией ИЛИ. В результате получилось составное высказывание А ИЛИ B. Высказывание А ложно, высказывание В ложно. Поэтому высказывание А ИЛИ B ложно: (А ИЛИ B) = 0.
Пример 4.4. Высказывание А: «Франциск Скорина — белорусский первопечатник». Истинно, А = 1.
Высказывание В: «Стефан Баторий — турецкий султан». Ложно, B = 0.


Высказывание «Франциск Скорина — белорусский первопечатник, ИЛИ Стефан Баторий — турецкий султан» будет истинным, (А ИЛИ В) = 1.
Пример 4.5*.
Рассмотрим выражение: А ИЛИ B И НЕ С. Распишем по действиям вычисление значения логического выражения:
Значение высказывания F, полученное в 3-м действии, определит значение исходного логического выражения.
Пример 4.6*.
Пусть высказывание А = 1, B = 0, С = 0. Найдем значение логического выражения: А ИЛИ B И НЕ С.
Значит, при начальных значениях А = 1, B = 0, С = 0 значение логического выражения А ИЛИ B И НЕ С истинно.
Пример 4.7. Высказывание А: «Прогноз погоды обещает дожди». Высказывание В: «Сейчас на улице идет дождь».
Высказывание А И B будет ложным, если мы увидели, что на улице нет дождя (независимо от того, что обещал прогноз погоды).

1 В каких условиях составное высказывание А И В может быть истинным?
- Если А истинно, а В ложно.
- Если А истинно и В истинно.
- Если А ложно и В истинно.
- Если А ложно, а В истинно.
2 В каких случаях составное высказывание А ИЛИ В может быть ложным?
- Если А истинно, а В ложно.
- Если А истинно и В истинно.
- Если А ложно и В ложно.
- Если А ложно, а В истинно.
Упражнения



1 Определите, истинными или ложными являются нижеприведенные составные высказывания.
- Мяч круглый, ИЛИ Земля плоская.
- Кролики — домашние животные, И баобаб растет в Беловежской пуще.
- Клавиатура — устройство ввода информации, ИЛИ винчестер — устройство вывода информации.
- М. Ю. Лермонтов написал стихотворение «Парус», И И. А. Крылов написал басню «Квартет».
- Сосна — хвойное дерево, И кедр — не хвойное дерево.
- Процессор — устройство обработки информации в компьютере, ИЛИ наушники — не устройство ввода информации.
- Континенты и острова — это большие участки суши.
2 О том, как прошли летние каникулы, Кира рассказала своим друзьям следующее:
- Я была у бабушки в деревне, и рядом с деревней было озеро.
- По озеру плавала лодка или утка.
- Мы с бабушкой насобирали малины и смородины.
- Я составила букет из цветов. В нем были ромашки или гвоздики.
Подготовьте к каждому из высказываний Киры рисунки, учитывая, что все высказывания истинны.
3 Откройте файл с рисунком и разложите грибы по корзинкам так, чтобы было истинным следующее высказывание: «В большой корзине все грибы съедобные, и в маленькой корзине все грибы несъедобные».

4 Откройте файл с рисунком и поставьте все цветы в вазы так, чтобы было истинным высказывание: «В синей вазе все цветы розы, или в красной вазе все цветы не красного цвета».
5* Найдите значения логических выражений, если А = 1, B = 1, С = 0, D = 0.
Основные логические операции. AND, NOT, OR и XOR (исключающее или)
В этой статье мы поговорим о некоторых битовых операциях. Рассмотрим основные из них: XOR (исключающее ИЛИ), AND (И), NOT (НЕ) а также OR (ИЛИ).
Как известно, минимальной единицей измерения информации является бит, который хранит одно из 2-х значений: 0 (False, ложь) либо 1 (True, истина). Таким образом, битовая ячейка может одновременно находиться лишь в одном из двух возможных состояний.
Для манипуляций с битами используют определённые операции — логические или булевые. Они могут применяться к любому биту, вне зависимости от того, какое у него значение — ноль или единица. Что же, давайте посмотрим на примеры использования трёх основных логических операций.
Логическая операция AND (и)
AND обозначается знаком & .
Оператор AND выполняется с 2-мя битами, возьмём, к примеру, a и b. Результат выполнения операции AND равен 1, если a и b равняются 1. В остальных случаях результат равен 0. Например, с помощью AND вы можете узнать, чётное число или нет.
Посмотрите на таблицу истинности операции AND:

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

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

Используя XOR (исключающее ИЛИ), вы можете поменять значения 2-х переменных одинакового типа данных, не используя временную переменную. А ещё, посредством XOR можно зашифровать текст, например:
String msg = "This is a message"; char[] message = msg.toCharArray(); String key = ".*)"; String encryptedString = new String(); for(int i = 0; i
Согласен, XOR — далеко не самый надёжный метод шифрования, но это не значит, что его нельзя сделать частью какого-либо шифровального алгоритма.
Логическая операция NOT (НЕ)
Это побитовое отрицание, поэтому выполняется с одним битом и обозначается ~ .
Результат зависит от состояния бита. Если он в нулевом состоянии, то итог операции — единица и наоборот. Всё предельно просто.

Эти 4 логические операции следует запомнить в первую очередь, т. к. с их помощью можно получить практически любой возможный результат. Также существуют такие операции, как > (побитовый сдвиг вправо).
Условный оператор
Проверьте истинность второго отношения при подстановке следующих значений:
Определение. Выражение, о котором после подстановки в него значений переменных можно сказать, истинно (верно) оно или ложно (неверно), называется булевым (логическим) выражением.
Примечание. Название “булевы” произошло от имени математика Джорджа Буля, разработавшего в 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, то выполнение программы закончится аварийно.
Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод.
- х=23, у=5;
- х=-5, у=15;
- х=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. |