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


Содержание

C# — Операторы

Оператор — это символ, который сообщает компилятору выполнить определенные математические или логические манипуляции. C # имеет богатый набор встроенных операторов и предоставляет следующие типы операторов:

  • Арифметические операторы
  • Реляционные операторы
  • Логические операторы
  • Побитовые операторы
  • Операторы присваивания
  • Другие операторы

В этом учебном пособии поочередно описываются арифметические, реляционные, логические, побитовые, присваивающие и другие операторы.

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

В следующей таблице показаны все арифметические операторы, поддерживаемые C #. Предположим, что переменная A содержит 10, а переменная B имеет 20, тогда —

Оператор Описание Пример
+ Добавляет два операнда A + B = 30
Вычитает второй операнд с первого A — B = -10
* Умножает оба операнда A * B = 200
/ Делит числитель на де-числитель B / A = 2
% Оператор модуля и остаток после целочисленного деления B% A = 0
++ Оператор приращения увеличивает целочисленное значение на единицу A ++ = 11
Оператор Decrement уменьшает целочисленное значение на единицу A— = 9

Реляционные операторы

В следующей таблице показаны все реляционные операторы, поддерживаемые C #. Предположим, что переменная A имеет место 10, а переменная B имеет 20, тогда —

Оператор Описание Пример
== Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным. (A == B) не соответствует действительности.
знак равно Проверяет, равны ли значения двух операндов или нет, если значения не равны, условие становится истинным. (A! = B) истинно.
> Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным. (A> B) неверно.
= Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным. (A> = B) неверно.
> Двоичный оператор правого сдвига.Значение левых операндов перемещается вправо на количество бит, заданных правым операндом. A >> 2 = 15, что составляет 0000 1111

Операторы присваивания

Существуют следующие операторы присваивания, поддерживаемые C # —

Оператор Описание Пример
знак равно Простой оператор присваивания, присваивает значения из правых операндов в левый операнд C = A + B присваивает значение A + B в C
+ = Добавить AND присваивания, Он добавляет правый операнд в левый операнд и присваивает результат левому операнду C + = A эквивалентно C = C + A
знак равно Вычитание и оператор присваивания, он вычитает правый операнд из левого операнда и присваивает результат левому операнду C — = A эквивалентно C = C — A
знак равно Оператор умножения и присваивания, Он умножает правый операнд на левый операнд и присваивает результат левому операнду C * = A эквивалентно C = C * A
знак равно Оператор Divide AND assign. Он делит левый операнд на правый операнд и присваивает результат левому операнду C / = A эквивалентно C = C / A
знак равно Модуль и оператор присваивания, он принимает модуль с использованием двух операндов и присваивает результат левому операнду C% = A эквивалентно C = C% A
> = Оператор правой смещения и назначения C >> = 2 совпадает с C = C >> 2
знак равно Оператор побитового И присваивания C & = 2 является таким же, как C = C & 2
^ = побитовое исключающее ИЛИ и оператор присваивания C ^ = 2 является таким же, как C = C ^ 2
| = побитовое включение OR и оператор присваивания C | = 2 совпадает с C = C | 2

Есть несколько других важных операторов, включая sizeof, typeof и ? :поддерживается C #.

Оператор Описание Пример
размер() Возвращает размер типа данных. sizeof (int), возвращает 4.
тип() Возвращает тип класса. TypeOf (StreamReader);
& Возвращает адрес переменной. & А; возвращает фактический адрес переменной.
* Указатель на переменную. * А; создает указатель с именем ‘a’ для переменной.
? : Условное выражение Если условие верно? Тогда значение X: В противном случае значение Y
является Определяет, имеет ли объект определенный тип. Если (Ford — Car) // проверяет, является ли Ford объектом класса Car.
в виде Передача без создания исключения, если сбой выполняется. Object obj = new StringReader («Hello»);

StringReader r = obj как StringReader;

Приоритет оператора в C #

Приоритет оператора определяет группировку терминов в выражении. Это влияет на оценку выражения. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.

Например, x = 7 + 3 * 2; здесь x назначается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому первая оценка выполняется для 3 * 2, а затем 7 добавляется в нее.

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

Логические операции «И», «ИЛИ», «Отрицание» (Калькулятор)

Помогите пожалуйста написать код на логические операции И и ИЛИ для работы на калькуляторе ( по аналогии с Отрицанием):

17.05.2013, 22:50

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

Если ответ отличается от «да» или «нет» тогда программа должны писать «Ничего не понятно»
Программа работает так как мне нужно (оптимизация не интересует) есть только один момент где.

Проблема при сравнении: «Оператор «>» не может применяться к операндам типа «Т» и «Т»»
Добрый день , пишу сортировку , все делаю на основе Т , но вот в чем проблемма public class.

Методом вычислить тип треугольника: «не существует», «тупоугольный», «прямоугольный», «остроугольный»
Помогите пожалуйста С помощью метода вычислить тип треугольника::cry: 1) если первый параметр.

Логические выражения в C#

Информация о работе

Тип Лекции
Предмет Программирование
Количество страниц 7
Язык работы Русский язык
Дата загрузки 2015-01-04 00:04:32
Размер файла 34.98 кб
Количество скачиваний 21

Узнать стоимость работы

Заполнение формы не обязывает Вас к заказу работы

Скачать файл с работой

Помогла работа? Поделись ссылкой

Существуют задачи, при решении которых появляются величины, принимающие только одно из двух возможных значений. Одно из этих состояний принимается за «истинное», а другое за «ложное». Для этих величин не может быть задано никакое третье значение (естественно, процесс переключения такой величины из одного состояния в другое не рассматривается), например, лампочка может быть включена или выключена. Обычно логические величины появляются при проверке логических отношений.
Логические величины входят в состав логических выражений, используемых в операторах управления программой (операторах условного перехода, операторах цикла и т.д.). Логические выражения состоят из арифметических выражений, логических отношений и логических операций.
В языке C# определены следующие операции логических отношений:
> строго больше;
= больше или равно;
= b/2 — 1
c != S
В результате проверки логических отношений формируются значения истинности и ложности.
Помимо числовых величин в логических отношениях могут участвовать символы и строки. В этом случае символы сравниваются по своим числовым кодам в соответствие с кодовой таблицей. Аналогично строки сравнивают по кодам символов слева направо до первого, не совпадающего по коду символа, который и определяет, какая из строк больше (или меньше).
В языке C# существует тип данных bool, позволяющий объявлять переменные логического типа, которые могут принимать значения true (истинно) и false (ложно).
Кроме операций логических отношений в логических выражениях могут использоваться логические операции. Определены следующие логические операции:
Логическая операция Название Обозначение
Отрицание NOT (Не) !
Логическое сложение OR (ИЛИ) ||
Логическое умножение AND (И) &&
Исключительное ИЛИ (двуместная операция) XOR ^
Исключительное ИЛИ (одноместная операция) XOR

Поразрядное Логическое сложение OR (ИЛИ) |
Поразрядное Логическое умножение AND (И) &
Результаты выполнения логических операций наглядно можно представить в виде таблиц истинности. В этих таблицах A и B операнды, а R — результат выполнения операции. Следует отметить, что название логических операций соответствует их смыслу в разговорном языке (как русском, так и английском).
В языке С++ нет жесткого выделения логических констант, все целые числа кроме нуля в логических выражениях соответствуют понятию true, а целочисленный нуль соответствует понятию false. В языке C# эти значения принимают только переменные типа bool. Однако для наглядности пояснения логических операций удобно использовать систему языка С++, считая что 1 соответствует понятию true, 0 соответствует false.
|| (OR)
&& (AND) ^ (XOR)
A B R A B R A B R
0 0 0 0 0 0 0 0 0
0 1 1 0 1 0 0 1 1
1 0 1 1 0 0 1 0 1
1 1 1 1 1 1 1 1 0
Как видно из таблицы для операции ИЛИ (||), результат получается истинным, если истинным является хотя бы один из операндов. Логическое сложение отличается от арифметического тем, что при сложении двух единиц (значений «истинно») результат равен 1, а не 2. Это и не удивительно, поскольку для логических величин нет третьего состояния.
Обычно логические операции позволяют создать фильтры для отбора данных по какому-либо критерию. Логическая операция ИЛИ позволяет выбрать один или несколько элементов из списка. Например, если выполняется набор группы студентов специальности АСУ, желающих поехать в туристическую поездку, то подходящими кандидатами являются ИЛИ студенты группы 2бАСУ1, ИЛИ студенты группы 2бАСУ2. Таким образом, в группу могут попасть как студенты любой из групп, так и из обеих групп вместе.
Операция логического умножения И (&&) выдает результат «истинно», если истинными являются все участвующие в операции операнды. Эта операция практически не отличается от арифметического умножения, и позволяет выбрать элементы с полным совпадением ключевых признаков. Например, для проверки попадания величины в заданный диапазон значений требуется, чтобы значение величины было больше минимального значения И меньше минимального значения.
Операция исключительного ИЛИ (^ либо

) выдает результат «истинно», если истинным является только один участвующий в операции операнд. Эта операция в разговорном языке соответствует конструкции ИЛИ – ИЛИ («или вы ликвидируете задолженность, или будете отчислены из института»). При построении фильтров эта операция обеспечивает выбор альтернативы. Эта операция существует в двух вариантах: для двухместных операций (^) и для поразрядных операций (

).
Безусловно, также как и в арифметических выражениях, в логическом выражении могут быть более двух операндов для любой из логических операций, а последние могут быть связаны между собой в любых сочетаниях.
Перечисленные выше логические операции могут выполняться для результатов проверки логических отношений, но они могут также использоваться для поразрядного выполнения, т.е. для выполнения логических операций над отдельными разрядами двоичного представления элемента данных. Поразрядные логические операции позволяют выполнить три операции:
• Установить в единицу отдельный бит в двоичном представлении числа.
• Проверить значение отдельного бита в двоичном представлении числа
• Сбросить в нуль значение отдельного бита в двоичном представлении числа.
Для операции поразрядного логического умножения записывают один символ «&». Пусть объявлены и инициализированы две переменные a и mask, как показано ниже. В примечаниях приведены двоичные коды инициализированных переменных a, mask и результата c. Числа представлены в шестнадцатеричных кодах для наглядности, в компьютере числа всегда записаны в двоичной системе счисления.
Ниже представлена подпрограмма, распечатывающая двоичный код числа.
// Подпрограмма представления числа в двоичном коде
// n — число, w — сколько младших цифр представить
static string conv(uint n, int w)
<
uint mask = 1;
char p;
string st = «»; // Пустая строка для двоичных цифр
for (int i = 0; i
<
if (t == true) // Действие при первом проходе
else //Действие при втором проходе

Цукерберг рекомендует:  Интелект. - Ищу инициативных людей, для создания компании.

t ^= false; // Это сокращенная форма записи оператора t = t ^ false;
>

Для установки в нуль отдельного бита, сохраняя единицы в остальных разрядах, требуется создать маску, которая содержит нулевой бит в изменяемом разряде и единицы во всех остальных разрядах. Для этого можно задать маску как обычно для поразрядной операции ИЛИ, а затем применить к ней одноместную операцию XOR.
static void Main(string[] args)
<
uint a, mask, c;
mask = 0x08; // Маска
a = 0xDC; // Исходное число
// Поразрядная операция И с инвертированной маской
c = a &

mask;
Console.WriteLine(» Операция a &

mask результат
<0,8:X>«, c);
Console.WriteLine(» <0>исходное число
<1>маска», conv(a,8),conv(mask,8));
Console.WriteLine(«<0>«,conv(c,8));
Console.ReadKey();
>
После выполнения этой операции будет выведено:

Кроме перечисленных возможно также выполнение операций сдвига содержимого для целочисленных переменных. Для обозначения этих операций используются знаки >>n (сдвиг вправо) или > 4;
x = y В этом примере переменной t присваивается значение переменной s после сдвига значения последней на 4 двоичных разряда вправо, а переменной x сдвинутое на один разряд влево содержимое переменной y.
Операция сдвига влево на каждый разряд сдвига увеличивает сдвигаемое значение в 2 раза (умножает на 2) и заполняет освобождающиеся справа разряды числа нулями. Сдвиг вправо равносилен делению числа на два, но при этом положительные числа дополняются слева нулями, а отрицательные единицами. Это может привести к ошибке, поскольку при сдвиге вправо отрицательного числа на количество разрядов, равное разрядности числа, результат всегда будет состоять из одних двоичных единиц, независимо от начального значения числа. Если же переменная объявлена с модификатором unsigned, то при сдвиге вправо число слева дополняется нулями, то есть, искажение результата не происходит

C#: логические (Boolean) типы и операторы

Тип bool (он же System.Boolean ) — логическое значение, которому может быть присвоен литерал true или false . Тип bool требует всего один бит для хранения значения в памяти, однако фактически он занимает один байт — минимальный размер, с которым может работать процессор. Чтобы избежать неэффективного использования памяти в случае с массивами, в фреймворке есть класс BitArray (в пространстве имен System.Collections ), который использует один бит для логических значений.

Операторы отношений (Equality and Comparison Operators)

Операторы равенства == и неравенства != проверяют два значения на равенство или неравенство и всегда возвращают логическое ( bool ) значение. Для ссылочных типов равенство, по умолчанию, подразумевает равенство ссылок, а не самих объектов, на которые эти ссылки указывают. Поэтому два экземпляра объекта с одинаковыми данными фактически равны не будут, если только оператор == специально не перегружен (overloaded, об этом ниже) для достижения такого эффекта.

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

Условные или логические операторы (Conditional Operators)


Операторы && и || выполняют логические операции И и ИЛИ. Они часто используются с оператором ! , который выражает отрицание — НЕ. Операторы && и || являются сокращенными, что означает что каждое последующее выражение будет высчитываться только если в этом есть необходимость. Эта особенность в некоторых случаях очень полезна, т.к. позволяет выполнять выражения без выбрасывания NullReferenceException :

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

Доброго времени суток! В этой статье я доступно и коротко расскажу о выражения и операциях, часто используемых в C#. Основной код программы, написанной на C#, состоит из операторов и блоков операторов. Операторы, состоят из выражений, а те, в свою очередь – из операций и операндов. Пример простейшего выражения: 2 + 5; где «2» и «5» являются операндами, а «+» – операцией.

В программах, написанных на C#, операндами обычно являются объекты классов (в том числе, пользовательских) или переменные/константы встроенных типов.

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

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

Давайте теперь рассмотрим основные операции, доступные в C#!

«.» – операция доступа к полю/свойству/методу класса. Использовать можно, например, так:

«()» – операция вызова метода. Использовать можно, следующим:

«[]» – операция доступа к массиву (если хотите, к элементу массива). Пример использования:

«++» и «» после операнда – операции постинкремента и постдекремента (как правило, увеличивает и уменьшает, соответственно, значение операнда на единицу). Использовать можно так:

«new» – операция создания объекта/массива. Использовать можно так:

«typeof» – операция получения информации о типе данных. Пример использования:

«» перед операндом – операция отрицания. Использовать можно так:

«!» перед операндом – операция логического отрицания. Использовать можно следующим образом:

» перед операндом – операция двоичного (побитового) отрицания. Инвертирует (0 меняет на 1, а 1 на ноль) каждый бит числа. Этой операцией, Вы будете пользоваться редко… Использовать можно так:

«++» и «» перед операндом – операции преинкремента и предекремента соответственно (как правило, увеличивает и уменьшает, соответственно, значение операнда на единицу). Использовать можно так:

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

На практике, постфиксная форма работает так:

«(…)» перед операндом – операция приведения типа. Используется для приведения переменной одного типа, к другому (так называемое, явное приведение типа). Использовать можно так:

«*» и «/» – операции умножения и деления. Думаю, использование этих операций в описании не нуждается.

«%» – данная операция, возвращает остаток от деления. К примеру, при делении четного числа на 2, вернет 0. На практике можно использовать так:

«+» и «» – операции сложения и вычитания. Думаю, в дополнительном описании не нуждаются.

« >» – операции побитового сдвига влево и вправо соответственно. Как это работает на практике:

«is» – операция проверки возможности приведения типа. На практике работает так:

«as» – операция преобразования типа, без генерации исключения в случае неудачи. Данная операция осуществляет попытку преобразовать объект одного типа к другому, но, если такое преобразование невозможно, возвращает null (пустую ссылку, если хотите). На практике это работает так:

«==» и «!=» – операции эквивалентности, эквивалентно и неэквивалентно (обратные друг другу операции).

«&» – операция побитового «И» для целочисленных типов и операция логического умножения, для bool-типов.

«^» – операция побитового исключающего «ИЛИ» для целочисленных типов и операция логического исключающего «ИЛИ», для bool-типов.

«|» – операция побитового «ИЛИ» для целочисленных типов и операция логического «ИЛИ», для bool-типов.

«&&» -– операция условного «И». Возвращает истину, если истины оба операнда, во всех остальных случаях, вернет ложь. Использовать можно так:

«||» -– операция условного «ИЛИ». Возвращает истину, если хоть один операнд имеет значение true. Использовать можно так:

«?» – условная операция. Имеет вид: [условие] ? [результат 1] : [результат 2]. Если выполняется условие, то возвращается [результат 1], если условие не выполняется – [результат 2]. Использовать можно так:

«=» – операция присваивания. Думаю, что пояснять для чего нужна эта операция не нужно, она использовалась не однократно в примерах выше.

«*=», «/=», «%=», «+=», «-=», « >=», «&=», «^=», «|=» – операции составного присваивания. Работу покажу на примере операции «+=»:

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

Для отправки комментария вам необходимо авторизоваться.

BestProg

Базовые операторы

Содержание

1. Какие виды или категории операторов существуют в языке C#?

В языке C# существуют следующие категории операторов:

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

2. Какие операторы принадлежат к категории арифметических операторов?

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

3. Примеры использования операторов сложения ( + ), вычитания ( — ), умножения ( * ) и деления ( / ).

Операторы сложения ( + ), вычитания ( — ), умножения ( * ) и деления ( / ) можно применять к любому встроенному числовому типу данных.

Пример 1. Операции над переменными целых типов.

Важно: деление целых чисел дает результат целого типа.

Пример 2. Операции над переменными, где есть данные с плавающей запятой.

Пример 3. Операции над переменными смешанных числовых типов.

Если один из операндов имеет тип с плавающей запятой, а второй операнд имеет целый тип, то результатом будет тип с плавающей запятой.


4. Какие особенности использования оператора вычисления остатка от деления ( % )?

Оператор % применяется для вычисления остатка при делении двух чисел. В отличие от языка C/C++ оператор % может быть применен к данным с плавающей запятой.

Пример.

5. Примеры применения операторов инкремента ( ++ ) и декремента ( — ).

Оператор инкремента ( ++ ) увеличивает значение операнда на 1 .

Оператор инкремента i++ или ++i есть аналогичен оператору

Оператор декремента ( ) уменьшает значение операнда на 1 .

Оператор декремента i или i аналогичен оператору

Пример 1.

Пример 2. Использование операции инкремента и декремента в выражении.

Пример 3.

6. Какие особенности применения операторов отношения в C# ?

Операторы отношения применяются для сравнения значений двух операндов между собой. Результатом работы операторов отношения есть значение истины ( true ) или лжи ( false ).

Цукерберг рекомендует:  Город делают «умным» сами его жители

В языке C# введены следующие операторы отношения:

Пример.

7. Какие особенности применения логических операторов в языке C# ?

Операнды логических операций должны относиться к типу bool .

В языке C# к логическим относятся следующие операции:

Пример применения логических операций.

8. Какие преимущества дает использование сокращенных логических операторов && и || ?

Сокращенные логические операции && и || работают так же как и обычные логические операции & (логическое « И «) и | (логическое « ИЛИ «).

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

Например. Рассмотрим логическое « ИЛИ » (оператор || ). Если первый операнд равен true , тогда нет смысла вычислять второй операнд, поскольку все выражение будет равно true .

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

За счет этого происходит сокращение времени обработки длинных логических выражений, которые содержат операции « И » и « ИЛИ «.

Пример.

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

9. Какие особенности применения оператора присваивания в программе?

Простейший оператор присваивания обозначается символом ‘ = ‘ (равно). Общая форма оператора присваивания:

Оператор присваивания может создавать «цепочку» присваиваний.

Пример.

В вышеприведенном примере значение ‘ 0.00 ‘ присваивается сначала переменной z , потом переменной y , потом переменной x .

Оператор присваивания может быть составным.

10. Как работают сокращенные (составные) операторы присваивания?

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

В C# существуют следующие сокращенные операторы присваивания для арифметических и логических операций:

Примеры применения сокращенных операторов присваивания.

11. Какие особенности применения поразрядных операторов в языке C# ?

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

В C# существуют следующие поразрядные логические операции:

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

Пример.

12. Какие особенности применения операторов сдвига в C# ?

Операторы сдвига могут применяться только к целым типам.

Для выполнения сдвига двоичных разрядов в C# предусмотрено два оператора:

Общая форма операторов сдвига:

где число_бит – число двоичных разрядов, на которые сдвигается указанное значение.

Пример.

Операция сдвига влево на n разрядов множит число на 2 в степени n . Сдвиг вправо на n разрядов означает деление на 2 в степени n .

Логические выражения в C/C++. Как ошибаются профессионалы

Введение

Я занимаюсь разработкой статического анализатора кода для языков C/C++/C# — PVS-Studio. В моей работе приходится много сталкиваться с открытым и закрытым кодом разных проектов. Часто результатом такой работы являются статьи о проверке open source проектов, содержащие описание найденных ошибок и недочётов. После просмотра большого объёма кода начинаешь замечать различные паттерны ошибок, которые допускают программисты. Так, мой коллега Андрей Карпов писал статью про эффект последней строки после нахождения большого количества ошибок, допущенных в последних фрагментах однотипного кода.

В начале этого года я проверил с помощью анализатора много проектов крупных компаний в сфере IT, которые, следуя современной тенденции, выкладывают в открытый доступ исходный код своих проектов под свободными лицензиями. Я стал замечать, что почти в каждом проекте находится ошибка в условном выражении из-за неправильной записи условных операторов. Само выражение достаточно простое и состоит всего из трёх операторов:

  • != || !=
  • == || !=
  • == && ==
  • == && !=



Всего таких условных выражений можно записать 6 штук, но 4 из них являются ошибочными: два являются всегда истинным или ложным; в двух результат всего выражения не зависит от результата входящего в него подвыражения.

Для доказательства неверного результата выражения я буду строить таблицу истинности в каждом примере; также я приведу для каждого примера по одному фрагменту кода из открытого проекта. В этой статье будет упомянут и тернарный оператор ‘?:’, который имеет почти самый низкий приоритет из всех операторов, но очень много разработчиков не знают об этом.

Т.к. чаще всего я встречал неправильные условные выражения при проверке результата разных функций, код возврата которых сравнивают с кодами ошибок, то в приводимых далее синтетических примерах я буду использовать переменную с именем err, а code1 и code2 будут константами. При этом константы code1 и code2 не равны. Значение «other codes» будет означать любые другие константы, не равные code1 и code2.

Ошибки с использованием оператора ‘||’

Выражение != || !=

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

Далее представлена таблица истинности для этого примера кода:

Теперь посмотрим на реальный пример ошибки, найденной в проекте LibreOffice.

V547 Expression is always true. Probably the ‘&&’ operator should be used here. sbxmod.cxx 1777

Выражение == || !=

Синтетический пример, в котором результат всего условного выражения не зависит от результата подвыражения (err == code1):

Далее представлена таблица истинности для этого примера кода:

Теперь посмотрим на реальный пример ошибки, найденной в проекте FreeBSD.

V590 Cons >
Не сильно он отличается от синтетического примера, не правда ли?

Ошибки с использованием оператора ‘&&’

Выражение == && ==

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

Далее представлена таблица истинности для этого примера кода:

Теперь посмотрим на реальный пример ошибки, найденной в проекте SeriousEngine.

V547 Expression is always false. Probably the ‘||’ operator should be used here. entity.cpp 3537

Выражение == && !=

Синтетический пример, в котором результат всего условного выражения не зависит от результата подвыражения «err != code2»:

Далее представлена таблица истинности для этого примера кода:

Теперь посмотрим на реальный пример ошибки, найденной в проекте ChakraCore — JavaScript-движке для Microsoft Edge.

V590 Cons expression. The expression is excessive or contains a misprint. rl.cpp 1388

Ошибки с использованием оператора ‘?:’

V502 Perhaps the ‘?:’ operator works in a different way than it was expected. The ‘?:’ operator has a lower priority than the ‘|’ operator. ata-serverworks.c 166

В заключение хочу сказать про тернарный оператор ‘?:’. Его приоритет почти самый низкий среди всех операторов. Ниже только у присваивания, throw и оператора «запятая». Приведённая в примере ошибка была найдена в ядре FreeBSD. Здесь тернарным оператором воспользовались для выбора нужного флажка и чтобы написать короткий красивый код. Но приоритет оператора побитового ‘ИЛИ’ выше, поэтому условное выражение вычисляется не в том порядке, в каком планировал программист. Эту ошибку я тоже решил описать в этой статье, т.к. она является очень распространённой среди проверенных мною проектов.

Заключение

Описанные шаблоны условных выражений могут нести большую опасность, если не проявлять повышенную внимательность при написании кода. Несмотря на небольшое количество операторов, всё условное выражение может пониматься неправильно. Код, в котором допустили такую ошибку, может выглядеть вполне логичным и будет пропущен после code-review. Подстраховать себя от таких ошибок можно путём проверки своего кода с помощью построения таблиц истинности, если есть сомнения в правильности условия, а также с помощью регулярных проверок статическими анализаторами.

Программируем на C#

Блог содержит статьи, исходные тексты программ на C#. Здесь можно скачать исходник нужной программы.

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

Операторы отношения используются для сравнения двух величин, а поразрядные операторы — для выполнения поразрядных операций между величинами.

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

Оператор ! возвращает отрицание логической (булевой) величины.

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

В C# определяются следующие операторы отношения:

Возвращает истину, если a равно b

Возвращает истину, если a не равно b

Возвращает истину, если a больше b

Возвращает истину, если a больше или равно b

Эти операторы возвращают результат типа bool.

При сравнении двух объектов ссылочного типа компилятор сначала ищет операторы отношения, определенные для этих объектов. Если он не находит подходящего оператора, то для операторов отношения == и != вызывается соответствующий оператор отношения класса object. Этот оператор сравнивает, относятся ли два операнда к одному объекту; значения их переменных при этом не сравниваются.

Для типа string операторы отношения перегружаются так, чтобы == и != сравнивали не ссылки, а содержимое строк.

Логические и поразрядные операторы

В C# определяются следующие логические и поразрядные операторы:

Поразрядная операция AND с двумя операндами

Поразрядная операция OR с двумя операндами

Поразрядная операция XOR (исключающее OR) с двумя операндами

Логическая операция AND с двумя операндами

Логическая операция OR с двумя операндами

Операторы &, | и ^ обычно используются с целыми типами данных, хотя они также могут применяться и к типу bool.


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

b вычисляется лишь в том случае, если a равно true. В выражении

b вычисляется лишь в том случае, если a равно false.

Оператор проверки

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

IT1300: Императивное программирование

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

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

Если же первый операнд логической операции ИЛИ имеет истинное значение ( true ), то ее результат будет иметь истинное значение независимо от значения второго операнда.

Благодаря тому, что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.

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

В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной d на значение переменной n нацело. Если остаток от деления n/d равен нулю, то n делится на d нацело.

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

Для исключения ошибки из-за деления на нуль в операторе if сначала проверяется условие: равно ли нулю значение переменной d . Если оно равно нулю, то на этом выполнение укороченного логического оператора И завершается, а последующая операция деления по модулю не выполняется. Так, при первой проверке значение переменной d оказывается равным 2, поэтому выполняется операция деления по модулю. А при второй проверке это значение оказывается равным нулю, следовательно, операция деления по модулю пропускается, чтобы исключить деление на нуль. И наконец, выполняется обычный логический оператор И, когда вычисляются оба операнда. Если при этом происходит деление на нуль, то возникает ошибка при выполнении.

Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектов. Рассмотрим следующий пример программы.

Прежде всего обратим внимание на то, что переменная someCondition типа bool инициализируется значением false . Далее проанализируем каждый оператор if . Как следует из комментариев к данной программе, в первом операторе if переменная i инкрементируется, несмотря на то, что значение переменной someCondition равно false . Когда применяется логический оператор & , как это имеет место в первом операторе if , выражение в правой части этого оператора вычисляется независимо от значения выражения в его левой части. А во втором операторе if применяется укороченный логический оператор. В этом случае значение переменной i не инкрементируется, поскольку левый операнд (переменная someCondition ) имеет значение false , следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в C#.

И последнее замечание: укороченный оператор И называется также условным логическим оператором И, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих

И снова здравствуйте! :)

Это седьмая видео-статья из цикла «Основы Arduino для начинающих» и сегодня мы поговорим о таком важном понятии, как логические операции, без которых не обойтись при решении практически любой задачи.

Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5,6

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

Фраза логический (он же булевский) тип выражения означает, что это выражение может принимать только два значения – ложь или истина, 0 или 1. Если мы укажем переменной, что она имеет тип bool (boolean), то, как ни крути, значения, которые она сможет в себе нести, будут либо 0, либо 1. Помните, в предыдущих выпусках мы составляли условия, в зависимости от истинности или ложности которых происходили какие-либо действия – как раз тогда мы уже работали с булевыми выражениями.

Итак, кажется, теперь становится более понятной первая строчка определения – логическая операция, это операция над выражениями логического (булевского) типа. Теперь со второй частью об операциях алгебры логики.

Каждый из вас помнит уроки математики в школе, где мы работали с числами в привычной для нас, десятичной системе счисления – то есть с цифрами от 0 до 9. Но мир логики, если так можно сказать, отличается от нашего, ведь там все значения имеют только два состояния — 0 или 1, отсюда и возникает потребность в специальной математике для работы с логическими выражениями. Эта математика носит название «алгебра логики».

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

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

Давайте попробуем реализовать такую же систему на Arduino – возьмем, например, три кнопки и подключим их к микроконтроллеру, а так же добавим в схему светодиод и, при наличии, пьезо-извещатель.

Алгоритм работы такой системы достаточно прост и схож с тем, что мы писали для одной кнопки и светодиода, но, в данном случае возникает одна проблема — у нас не одна кнопка, для которой можно написать условие, а целых три. И при нажатии любой из кнопок у нас должен звучать сигнал и гореть светодиод. Что же делать? Можно, конечно, написать три отдельных условия для контроля каждой из кнопок, но код в таком случае выглядит нагроможденным и при увеличении количества кнопок становится жутко не удобным.

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

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

Давайте создадим три переменных типа boolean, в которые будем сохранять считанный сигнал от каждой из кнопок, и объединим эти переменные в одном условии, поставив между ними логическое ИЛИ. Эта операция записывается в виде двух вертикальных черточек и, что бы понять логику ее работы, давайте взглянем на так называемую таблицу истинности, где указываются операнды, над которыми совершается операция.

Два первых столбца это возможные значения на входах — например, если бы у нас было две кнопки и между ними мы производили дизъюнкцию. Как видите, при комбинации 00 итогом логического сложения так же будет 0. А вот следующая комбинация — 0 или 1 уже дает на выходе логическую единицу, так же, как и оставшиеся комбинации. Нижняя строка 11 так же выдаст единицу, поскольку мы производим сравнение двух положительных значений.

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

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

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

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

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

Эта операция записывается в виде двойного амперсанда (&&), и, такой символ — &, по сути, заменяет слово И (от английского and). Таким образом, если вам понадобится сделать условие истинным при одновременно нескольких истинных событиях, то этот оператор то, что нужно.

Это можно увидеть, если заменить в предыдущем коде ИЛИ на И.

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

Также мы можем комбинировать операции сложения и умножения в одной функции. Например, нам необходимо включать оповещение только при одновременном наличии сигнала с 1-й и 2-й кнопки, или со 2-й и 3-й. Тогда условие примет вот такой вид:

Скобками осуществляется разграничение между отдельными условиями и, по сути, сейчас у нас два условия в одном: первое – нажатие 1-й и 2-й кнопки, второе – нажатие 2-й и 3-й кнопки, что бы учесть выполнение одного из этих двух условий мы ставим между ними логическое ИЛИ.

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

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

Когда может понадобиться отрицание? Например, когда в условии нужно проверить не истинность какой-либо функции или переменной, а, наоборот, ее ложность. Но, как вы помните, например, оператор if разрешит нам попасть в тело условия, только если условие в его круглых скобках будет истинно, а не ложно, для ложного значения мы использовали else.

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

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

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

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

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

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

Ну а на этом про логические операции, пожалуй, все, не забывайте оценивать материал и писать свои пожелания и замечания, надеюсь, что вам было интересно :) Всем добра!

Цукерберг рекомендует:  Боковая корзина покупок
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих