Remkomplekty.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

В операторе отношения термин «отношение» означает взаимосвязь, которая может существовать между двумя значениями (больше, равно, …), а термин «логический» в логическом операторе — взаимосвязь между логическими значениями «истина» и «ложь».

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

Операторы отношения

Но значения типа bool могут сравниваться только на равенство или неравенство, поскольку истинные (true) и ложные (false) значения не упорядочиваются.

Например, сравнение true > false в C# не имеет смысла.

Рассмотрим пример программы, демонстрирующий применение операторов отношения и логических операторов:


Логические операторы в C# выполняют наиболее распространенные логические операции.
Тем не менее существует ряд операций, выполняемых по правилам формальной логики. Эти логические операции могут быть построены с помощью логических операторов, поддерживаемых в C#.
Следовательно, в C# предусмотрен такой набор логических операторов, которого достаточно для построения практически любой логической операции, в том числе импликации.

Импликация — это двоичная операция, результатом которой является ложное значение только в том случае, если левый ее операнд имеет истинное значение, а правый — ложное. (Операция импликации отражает следующий принцип: истина не может подразумевать ложь).
Операция импликации может быть построена на основе комбинации логических операторов ! и | :
!p | q .

Укороченные логические операторы

В C# предусмотрены также специальные, укороченные, варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций.
Если первый операнд логической операции И имеет ложное значение (false), то ее результат будет иметь ложное значение независимо от значения второго операнда.
Если же первый операнд логической операции ИЛИ имеет истинное значение (true), то ее результат будет иметь истинное значение независимо от значения второго операнда.
Благодаря тому что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.
Укороченная логическая операция И выполняется с помощью оператора &&, а укороченная логическая операция ИЛИ — с помощью оператора || .
Этим укороченным логическим операторам соответствуют обычные логические операторы & и | .
Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости.
Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги.
Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектов.

Пример демонстрирует разницу между операторами «&&» и «&», а также между «|» и «||» .
Далее рассмотрим варианты оператора присваивания.

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

Все уроки по C# расположены здесь

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

Обзор типа данных Boolean

На третьем уроке по основам C#, я показал логический тип данных. Логическая переменная может хранить только два значения, true или false. В следующем примере показано простое задание булевых переменных, которые объявлены с помощью bool.

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

Эквивалентность или равенство — данный оператор является бинарным оператором, он работает над двумя значениями или операндами. Оператор equivalence сравнивает два операнда и возвращает логическое значение, указывающее, совпадают ли они точно. Символом оператора для эквивалентности является знак двойного равенства (==).

Оператор неравенства сравнивает два операнда и возвращает true, если два значения различны. Оператор предоставляет оператору эквивалентности противоположную функциональность. Символ оператора — восклицательный знак и знак равенства (!=). Это читается как «не равно».

Оператор NOT является унарным оператором, так как действует на один операнд. Оператор NOT инвертирует значение логического значения. Если исходное значение true, то возвращаемое значение false; если исходное значение false, возвращаемое значение true. Операцию иногда называют двоичным дополнением.

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

Читать еще:  Strcmp си описание

Оператор AND представлен символом амперсанда

OR используется, чтобы сравнить два значения типа boolean. Оператор OR возвращает значение true, если один из операндов имеет значение true. Это может быть представлено следующей таблицей:

Оператор OR представлен символом бара (|)


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

статьи IT, Уроки по си шарп, си шарп, операторы

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

Логические операторы в Си-шарп служат для работы с логическим типом данных (bool), который может принимать только два значения – true или false. Их можно разделить на две категории: простые логические операторы и операторы сравнения.

В Си-шарп есть следующие логические операторы:

! – оператор «НЕ» является унарным и возвращает противоположное значение операнда.
static void Main(string[] args)
<
bool a, b = true, c = false;
a = !b; // a = false
a = !c; // a = true
>

|| — оператор «ИЛИ» является бинарным и возвращает false только тогда, когда оба операнда равны false, в остальных случаях результат будет true;
static void Main(string[] args)
<
bool a, bTrue = true, bFalse = false;
a = bFalse || bFalse; // a = false
a = bFalse || bTrue; // a = true
a = bTrue || bFalse; // a = true
a = bTrue || bTrue; // a = true
>

К операторам сравнения относятся:

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

Условные операторы служат для ветвления программы. В зависимости от некоторого условия выполняется тот или другой набор команд.

В Си-шарп есть три условных оператора: «if-else», «switch» и «?:» — тернарный оператор.

Оператор «if-else»

Данный оператор имеет следующую структуру:
if ([условное выражение])
<
Блок кода, который нужно выполнить при удовлетворении условия, [условное выражение] = true (истина)
>
else
<
Блок кода, который нужно выполнить при неудовлетворении условия, [условное выражение] = false (ложь)
>

Часть else не является обязательной и может отсутствовать.

Пример использования оператора «if-else» в программе, которая проверяет вводимое число на чётность:

static void Main(string[] args)
<
int a;
Console.WriteLine(«Введите число:»);
a = Convert.ToInt32(Console.ReadLine()); // вводим данные с клавиатуры*
if (a % 2 == 0) //проверяем число на чётность путем нахождения остатка от деления числа на 2
<
Console.WriteLine(«Число » + a + » — чётное»);
>
else
<
Console.WriteLine(«Число » + a + » — нечётное»);
>
Console.ReadKey();
>

* Функция Console.ReadLine() позволяет ввести данные с клавиатуры. Данные вводятся как строка, а так как нужно число, мы преобразовываем ее в числовой тип. Для преобразования мы используем функцию Convert.ToInt32().

Если после if или else необходимо выполнить лишь одну команду, фигурные скобки можно опускать:
if ([условное выражение])
[команда1] // команда1 выполнится лишь если условное выражение истинно
[команда2]// команда2 выполнится в любом случае

Оператор if может иметь несколько условий:
if ([логическое выражение1])
<блок1>
else if ([логическое выражение2])
<блок2>
else

Пример программы, которая определяет, какое из двух введенных чисел больше:
static void Main(string[] args)
<
int a, b;
Console.WriteLine(«Введите первое число:»);
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(«Введите второе число:»);
b = Convert.ToInt32(Console.ReadLine());
if (a > b)
Console.WriteLine(«Первое число больше второго»);
else if (a 40) //если температура меньше -20 или больше 40
Console.WriteLine(«Вам лучше посидеть дома!»);
else
Console.WriteLine(«Можете идти гулять»);
Console.ReadKey();
>

Оператор switch

В некоторых случаях удобно использовать условный оператор «switch» вместо «if-else». Он имеет следующую структуру:

switch (выражение)
<
case значение1:
блок1;
break;
case значение2:
блок2;
break;
.
case значениеN:
блокN;
break;
default:
блокN+1;
break;
>

Выражение сравнивается последовательно со значениями. Если выражение равно значению – выполняется соответственный блок кода и при достижении ключевого слова break оператор switch заканчивает работу. Если выражение не будет соответствовать ни одному значению, тогда выполнится блок после default.

Пример программы с использованием switch, которая выводит на экран название дня недели соответственно вводимому порядковому номер дня:

static void Main(string[] args)
<
int a;
Console.WriteLine(«Введите порядковый номер дня недели:»);
a = Convert.ToInt32(Console.ReadLine());
switch (a)
<
case 1:
Console.WriteLine(«Понедельник»);
break;
case 2:
Console.WriteLine(«Вторник»);
break;
case 3:
Console.WriteLine(«Среда»);
break;
case 4:
Console.WriteLine(«Четверг»);
break;
case 5:
Console.WriteLine(«Пятница»);
break;
case 6:
Console.WriteLine(«Суббота»);
break;
case 7:
Console.WriteLine(«Воскресенье»);
break;
default :
Console.WriteLine(«Ошибка»);
break;
>
Console.ReadKey();
>

Тернарный оператор «?:»

Этот оператор используется для сокращения объема кода. Им можно заменять простые по сложности операторы if-else. Тернарный оператор имеет такую структуру:

логическое выражение ? выражение1 : выражение2

Читать еще:  Сортировка простыми вставками паскаль

Сначала вычисляется логическое выражение. Если оно истинно, то вычисляется выражение1, в противном случае — вычисляется выражение2.

Пример использования тернарного оператора «?:» в той же программе для проверки числа на чётность:

static void Main(string[] args)
<
int a;
Console.WriteLine(«Введите число:»);
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine( a % 2 == 0 ? «Число чётное» : «Число нечётное» );
Console.ReadKey();
>

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

static void Main(string[] args)
<
int a, b, max;
Console.WriteLine(«Введите первое число:»);
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(«Введите второе число:»);
b = Convert.ToInt32(Console.ReadLine());
max = a > b ? a : b;
>

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

Массивы в Си-шарп могут быть одномерными и многомерными.

Одномерные массивы

Одномерный массив по-другому еще называется вектором, и для доступа к его элементам используется только один индекс. Выглядит вектор примерно так:

В Си-шарп объявление массива имеет такую структуру:

тип[] имя_массива = new тип[размер массива];

Пример:
int[] array = new int[5]; // создаем массив целых чисел
string[] seasons = new string[4] <"зима","весна","лето","осень">; //объявление массива строк и его инициализация значениями

Если происходит инициализация, оператор new можно упускать:

Доступ к элементам осуществляется по индексу. Следует помнить, что индексация начинается с нуля – первый элемент массива имеет индекс 0, а последний n-1, где n – размер массива.

static void Main(string[] args)
<
int[] numbers = new int[5];
numbers[0] = 5;
numbers[1] = 2;
numbers[4] = 3;
numbers[5] = 2; // ошибка, индекс вне рамок массива
>

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

Многомерные массивы

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

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

int[,] numbers1 = new int[2, 2]; // объявление двумерного массива
int[,,] numbers2 = new int[2, 2 ,3]; // объявление трехмерного массива
int[,] numbers3 = new int[3, 2] < <6, 0>,
<5, 7>,
<8, 9>>; // инициализация двумерного массива

Элементу массива numbers1 с координатами 1,1 присвоим значение 8:
numbers1[1, 1] = 8;

Многомерные массивы используются гораздо реже одномерных.

Условные выражения

Условные выражения – сложные логические конструкции, в языке программирования C#, которые используются для управления ходом выполнения программы.

Условные конструкции могут включать в себя:

  • Операции сравнения – это отдельная группа операторов, для сравнения значений, на вход принимают два аргумента одинакового типа данных, а возвращают логическое значение true(истина) или false(ложь);
  • Логические операции – операторы, которые используются для работы с логическим типом данных bool (название в .Net нотации System.Boolean).

Операции сравнения

Оператор проверки на равенство ==

Если операнды эквивалентны, то операция сравнения вернет значение true, если не равны — false.

Оператор проверки на неравенство !=

Если операнды не равны, то операция сравнения вернет значение true, если равны — false.

Оператор меньше

Вернет true, если первый операнд строго больше второго, в противном случае false.

Оператор больше равно >=

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

Логические операции

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

Оператор логического отрицания !

Отрицание (логическое не) – унарная операция, которая возвращает true при значении операнда false и false – когда значение на входе true.

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

Дизъюнкция (логическое или) – бинарная операция, которая вернет значение true, если один из операндов имеет значение true, в противном случае – false.

В языке C#, логическое или имеет две формы записи:

  • | – полная дизъюнкция, вычисляет оба операнда, даже если первый равен true;
  • || – сокращенное логическое сложение, если значение первого операнда true, то второй операнд не вычисляется.

Оператор логического умножения

Конъюнкция (логическое и) – бинарная операция, которая возвращает значение true, если оба операнда равняются true, в ином случае – false.

По аналогии с предыдущей операцией, логическое и поддерживает две формы записи:

Для улучшения производительности выполнения программы, рекомендуется использовать сокращенные формы логических операций “и”(&&) и “или”(||).

Оператор логического сложения по модулю ^

Исключительная дизъюнкция (операция xor) – бинарная операция, которая вернет значение true, если операнды не равны, то есть один из них имеет значение true, а другой — false, в противном случае – false.

Читать еще:  Чтение и запись в файл паскаль

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

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

Их операндами могут быть:

  • переменные и константы булевого типа;
  • конструкции сравнения;
  • логические выражения.

Логическое или с присвоением |=

Бинарный оператор, который присваивает левому операнду значение его дизъюнкции с правым:

Логическое и с присвоением &=

Бинарный оператор, который присваивает левому операнду значение его конъюнкции с правым:

Логическое исключительное или с присваивание ^=

Бинарный оператор, который присваивает левому операнду результат операции xor левого операнда с правым:

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

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

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

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

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

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

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

Логическое И

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×