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

Как обозначается или в c

  • автор:

Логический оператор OR: ||

Логический оператор OR ( || ) возвращает логическое значение true , если оба операнда являются true и возвращаются false в противном случае. Операнды неявно преобразуются в тип bool перед оценкой, а результат — тип bool . Логическое ИЛИ имеет ассоциативность в направлении слева направо.

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

В выражении логического ИЛИ сначала полностью вычисляется первый операнд и учитываются все побочные эффекты, и лишь после этого вычисление продолжается.

Второй операнд вычисляется только в том случае, если первый операнд вычисляется false , так как оценка не требуется, если логическое выражение OR не требуется true . Это называется кратковременной оценкой.

printf( "%d" , (x == w || x == y || x == z) ); 

В приведенном выше примере, если x равно w либо , y либо z второй аргумент функции printf вычисляется true , который затем повышен до целого числа, а значение 1 выводится. В противном случае оно вычисляется false и выводится значение 0. Как только одно из условий оценивается true , оценка останавливается.

Оператор ключевое слово для ||

C++ указывает or в качестве альтернативной орфографии для || . В C альтернативная орфография предоставляется в виде макроса в заголовке . В C++альтернативная орфография является ключевое слово; или эквивалентное не рекомендуется. В Microsoft C++ /permissive- параметр или /Za компилятор требуется для включения альтернативной орфографии.

Пример

// expre_Logical_OR_Operator.cpp // compile with: /EHsc // Demonstrate logical OR #include using namespace std; int main() < int a = 5, b = 10, c = 15; cout c yields " c) b || b > c yields " b || b > c)

Логические операторы в 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, вычисление прекращается.

См. также

  • Логический оператор И: &&
  • Логический оператор ИЛИ: ||

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

Л огические операторы – это операторы, которые принимают в качестве аргументов логические значений (ложь или истину) и возвращают логическое значение. Как и обычные операторы, они могут быть одноместными (унарными, т.е. принимать один аргумент), двуместными (бинарные, принимают два аргумента), трёхместными и т.д.

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

#include #include void main() < char boolValue = -71; if (boolValue) < printf("boolValue is true"); >else < printf("boolValue is false"); >_getch(); >

Логические значения обычно порождаются операторами сравнения (==, !=, >, =. <=).

В языке си представлено три логических оператора: И, ИЛИ и НЕ. Начнём с самого простого

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

О ператор НЕ (NOT) используется для того, чтобы инвертировать значение аргумента. Т.е., если ему передали истину, то он вернёт ложь, если получил ложь в качестве аргумента, то вернёт истину.

Логический оператор НЕ

X NOT X
0 1
1 0

В си отрицание представлено оператором !. Например

#include #include void main() < int i = 0; if (i) < printf("i is true\n"); >if (!i) < printf("i is not true\n"); >if (!!i) < printf("i is not not true\n"); >if (. i) < printf("i is not not not true\n"); >_getch(); >

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

Логическое И

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

Логический оператор И

X Y X AND Y
0 0 0
0 1 0
1 0 0
1 1 1

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

#define _CRT_SECURE_NO_WARNINGS #include #include void main() < char gender; unsigned int age; printf("Enter gender ('M' or 'F')\n"); scanf("%c", &gender); printf("Enter age\n"); scanf("%u", &age); if (gender == 'M' && age >17) < printf("Wellcome"); >else < printf("Go away"); >_getch(); >

Оператор И может применяться последовательно к нескольким аргументам. Для него действует ассоциативный и коммутативный законы. Усовершенствуем программу, будем также вводить рост:

#define _CRT_SECURE_NO_WARNINGS #include #include void main() < char gender; unsigned int age; unsigned int height; printf("Enter gender ('M' or 'F')\n"); scanf("%c", &gender); printf("Enter age\n"); scanf("%u", &age); printf("Enter height\n"); scanf("%u", &height); if (gender == 'M' && age >17 && height >= 180) < printf("Wellcome"); >else < printf("Go away"); >_getch(); >

Также условие могло быть записано

(gender == 'M' && age > 17) && height >= 180
gender == 'M' && (age > 17 && height >= 180)
(age > 17 && height >= 180) && gender == 'M'

Логическое ИЛИ

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

Логический оператор ИЛИ

X Y X OR Y
0 0 0
0 1 1
1 0 1
1 1 1

В си ИЛИ представлен оператором ||. Например, усовершенствуем программу: теперь пол можно вводить как большой, так и маленькой буквой

#define _CRT_SECURE_NO_WARNINGS #include #include void main() < char genderInput; char gender; unsigned int age; unsigned int height; printf("Enter gender ('M' or 'F')\n"); scanf("%c", &genderInput); printf("Enter age\n"); scanf("%u", &age); printf("Enter height\n"); scanf("%u", &height); if (genderInput == 'M' || genderInput == 'm') < gender = 1; >else < gender = 0; >if ((age > 17 && height >= 180) && gender) < printf("Wellcome"); >else < printf("Go away"); >_getch(); >

Как и в случае оператора И, ИЛИ коммутативен и ассоциативен.

Операторы можно перемешивать друг с другом, создавая сложные операторы

#define _CRT_SECURE_NO_WARNINGS #include #include void main() < char gender; unsigned int age; unsigned int height; printf("Enter gender ('M' or 'F')\n"); scanf("%c", &gender); printf("Enter age\n"); scanf("%u", &age); printf("Enter height\n"); scanf("%u", &height); if ((age >17 && height >= 180) && (gender == 'M' || gender == 'm')) < printf("Wellcome"); >else < printf("Go away"); >_getch(); >

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

Пример: закон де-Моргана. Чтобы сменить И на ИЛИ (или наоборот), необходимо инвертировать значения всех операндов, заменить И на ИЛИ (или ИЛИ на И) и инвертировать конечный результат. В случае с нашим условием

(age > 17 && height >= 180) && (gender == 'M' || gender == 'm')

Рассмотрим сначала кусок

(age > 17 && height >= 180)

Меняем все значения на обратные

(!(age > 17) && !(height >= 180))

заменяем оператор && на ||

(!(age > 17) || !(height >= 180))

и инвертируем ответ

!(!(age > 17) || !(height >= 180))

Как видим, результат тот же. Очевидно, что

!(age > 17)

Таким образом, изменим условие

Поменяем таким же образом вторую скобку

(gender == 'M' || gender == 'm')
!(gender != 'M' && gender != 'm')

Теперь можно применить это же правило и для всего выражения

Порядок выполнения логических операторов

Р ассмотрим выражение

где a, b, c, d – логические значения. Всё выражение равно истине тогда и только тогда, когда все операнды истинны. Если хотя бы один из операндов ложь, то остальные уже не важны. Поэтому, для оптимизации работы, вычисление происходит слева направо и останавливается, как только был найден первый операнд, равный нулю.

В си оператор присваивания может возвращать значение. Иногда он используется непосредственно в условии:

#define _CRT_SECURE_NO_WARNINGS #include #include #include void main() < int a = 0; int *p = &a; if (a && (p = (int*) malloc(sizeof(int) * 2))) < printf("memory was allocated"); >free(p); _getch(); >

В данном случае, оператор malloc не будет выполнен, так как первый операнд a равен 0 (соответственно, всё выражение равно нулю). Таким образом, оператор free попытается очистить память, которую не может очистить (т.к. p продолжит ссылаться на a). Если же мы поменяем a = 1, то всё отработает без проблем.

То же самое происходит и при выполнение ||. Выражение

выполняется слева направо до тех пор, пока не встретит первое ненулевое значение. После этого выполнение останавливается, так как известно, что всё выражение равно истине.

Очевидно, что это касается не только оператора присваивания, но и любого другого вызова функции. Например, в этом случае функции foo будет вызвана, bar нет.

#define _CRT_SECURE_NO_WARNINGS #include #include #include int foo() < printf("foo\n"); return 0; >int bar() < printf("bar\n"); return 0; >void main() < int a = 0, b = 1; if (a || foo() || b || bar()) < printf("OK\n"); >_getch(); >

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

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

email

Всё ещё не понятно? – пиши вопросы на ящик

C#: Логические операторы

Мы уже умеем писать методы, которые проверяют одиночные условия. Теперь научимся строить составные условия. Хороший пример: проверка пароля. Как вы знаете, некоторые сайты при регистрации хотят пароль от 8 до 20 символов в длину. Честно говоря, это странное ограничение, но что поделать. В математике мы бы написали 8 < x < 20 , но в C# такой трюк не пройдет. Нам придётся сделать два отдельных логических выражения и соединить их специальным оператором «И»:

Вот метод, который принимает пароль и говорит, соответствует ли он условиям ( true ) или не соответствует ( false ):

// Пароль длиннее 8 символов **И** пароль короче 20 символов. public static bool IsCorrectPassword(string password) < var length = password.Length; return length >8 && length < 20; >App.IsCorrectPassword("qwerty"); // false App.IsCorrectPassword("qwerty1234"); // true 

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

a && b || c; // Без скобок сложно понять приоритет a && (b || c) // Приоритет очевиден 

Другой пример. Мы хотим купить квартиру, которая удовлетворяет условиям: площадь от 100 кв. метров и больше на любой улице ИЛИ площадь от 80 кв. метров и больше, но на центральной улице Main Street. Напишем метод, проверяющий квартиру. Он принимает два параметра: площадь (число) и название улицы (строку):

public static bool IsGoodApartment(int area, string street) < return area >= 100 || (area >= 80 && "Main Street" == street); > App.IsGoodApartment(91, "Queens Street"); // false App.IsGoodApartment(78, "Queens Street"); // false App.IsGoodApartment(70, "Main Street"); // false App.IsGoodApartment(120, "Queens Street"); // true App.IsGoodApartment(120, "Main Street"); // true App.IsGoodApartment(80, "Main Street"); // true 

Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже показаны «таблицы истинности» — по ним можно определить, каким будет результат применения оператора:

И &&

A B A && B
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE

ИЛИ ||

| A | B | A || B |
| ----- | ----- | -------- |
| TRUE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE |

Задание

Джон поручил Сэму реализовать автоматическое распознавание солдат Ланнистеров на видео. Идея автоматизировать дозор крепости казалась ему привлекательной. В процессе работы Сэму понадобилось написать функцию, которая определяет, Ланнистер ли перед ним или нет. Немного подумав, Сэм выделил следующие правила определения Ланнистера:

Если у солдата доспехи красного цвета И нет щита

ИЛИ

если у солдата есть щит с изображением льва

то это Ланнистер.

Ланнистер или нет

Напишите метод IsLannisterSoldier() , которая принимает на вход два аргумента:

  1. Цвет доспехов (строка). Если доспехи красные, то строка "red" .
  2. null если щита нет. Строка "lion" , если щит есть, и на нём изображен лев.

Функция возвращает true , если распознан Ланнистер, и false если не распознан.

App.IsLannisterSoldier("red", "lion"); // true App.IsLannisterSoldier("blue", null); // false 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

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

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

https://czena.narkolog-na-dom-voronezh-11.ru/