Foreversoft.ru

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

Операции си шарп

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

C# — Руководство по C# — Операторы отношения и логические операторы

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

Ниже перечислены операторы отношения:

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

ОператорЗначение
==Равно
!=Не равно
>Больше
=Больше или равно
Логические операторы C#

ОператорЗначение
&И
|ИЛИ
^Исключающее ИЛИ
&&Укороченное И
||Укороченное ИЛИ
!НЕ

Результатом выполнения оператора отношения или логического оператора является логическое значение типа bool.

В целом, объекты можно сравнивать на равенство или неравенство, используя операторы отношения == и !=. А операторы сравнения , = могут применяться только к тем типам данных, которые поддерживают отношение порядка. Следовательно, операторы отношения можно применять ко всем числовым типам данных. Но значения типа bool могут сравниваться только на равенство или неравенство, поскольку истинные (true) и ложные (false) значения не упорядочиваются. Например, сравнение true > false в C# не имеет смысла.

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

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

Операция импликации может быть построена на основе комбинации логических операторов ! и |:

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

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

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

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

Стоит отметить, что при возникновении исключительной ситуации во время отладки кода, Visual Studio 2010 выводит сообщение следующего характера:

Операции. Перегрузка операций

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

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

Терминологическое примечание. Часто в русскоязычных текстах смешивают понятия «операция» и «оператор». Оператор — это наименьшая автономная часть языка программирования, команда или набор команд (составной оператор). Опера́ция — конструкция языка, аналогичная по записи математическим операциям, то есть специальный способ записи некоторых действий. Путаница связана еще и с тем, что в С и C++ присваивание и инкремент/декремент являются и операторами, и операциями. Чаще всего, операция является частью оператора. Поэтому далее будем употреблять термин «перегрузка операции».

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

Операция C#Возможность перегрузки
+, -, !, ++, —, true, falseЭтот набор унарных операций может быть перегружен
+, -, *, /, %, &, |, ^, >Эти бинарные операции могут быть перегружены
==, !=, , =Эти операции сравнения могут быть перегружены. C# требует совместной перегрузки «подобных» операций (т.е. , =, == и !=)
[ ]Операция [] не может быть перегружена. Аналогичную функциональность предлагают индексаторы
( )Операция () не может быть перегружена, но ту же функциональность предоставляют специальные методы преобразования
+=, -=, *=, /=, %=, &=, |=, ^=, >=Сокращенные операции присваивания не могут перегружаться; однако вы получаете их автоматически, перегружая соответствующую бинарную операцию

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

Вместо op подставляется перегружаемая операция, например + или /, а возвращаемый_тип обозначает конкретный тип значения, возвращаемого указанной операцией. Это значение может быть любого типа, но зачастую оно указывается такого же типа, как и у класса, для которого перегружается операция. Такая корреляция упрощает применение перегружаемых операций в выражениях. Для унарных операций операнд обозначает передаваемый операнд, а для бинарных операций то же самое обозначают операнд1 и операнд2. Заметим, что операторные методы должны иметь оба спецификатора типа — public и static.

Пример перегрузки бинарной операции:

Результат:Здесь выполняются операции сложения и разности двух векторов (выделено красным цветом).

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

Операции си шарп

В C# используется большинство операций, которые применяются и в других языках программирования. Операции представляют определенные действия над операндами — участниками операции. В качестве операнда может выступать переменной или какое-либо значение (например, число). Операции бывают унарными (выполняются над одним операндом), бинарными — над двумя операндами и тернарными — выполняются над тремя операндами. Рассмотрим все виды операций.

Бинарные арифметические операции:

Операция сложения двух чисел:

Операция вычитания двух чисел:

Операция умножения двух чисел:

операция деления двух чисел:

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

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

Для выхода из этой ситуации необходимо определять литералы или переменные, участвующие в операции, именно как типы double или float:

Операция получение остатка от целочисленного деления двух чисел:

Также есть ряд унарных операций, в которых принимает участие один операнд:

Инкремент бывает префиксным: ++x — сначала значение переменной x увеличивается на 1, а потом ее значение возвращается в качестве результата операции.

И также существует постфиксный инкремент: x++ — сначала значение переменной x возвращается в качестве результата операции, а затем к нему прибавляется 1.

Операция декремента или уменьшения значения на единицу. Также существует префиксная форма декремента ( —x ) и постфиксная ( x— ).

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

Умножение, деление, получение остатка

Для изменения порядка следования операций применяются скобки.

Рассмотрим набор операций:

Здесь мы имеем дело с тремя операциями: декремент, вычитание и умножение. Сначала выполняется декремент переменной c, затем умножение b*a, и в конце вычитание. То есть фактически набор операций выглядел так:

Но с помощью скобок мы могли бы изменить порядок операций, например, следующим образом:

Ассоциативность операторов

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

Стоит нам трактовать это выражение как (10 / 5) * 2 или как 10 / (5 * 2) ? Ведь в зависимости от трактовки мы получим разные результаты.

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

Левоассоциативные операторы, которые выполняются слева направо

Правоассоциативные операторы, которые выполняются справа налево

Все арифметические операторы (кроме префиксного инкремента и декремента) являются левоассоциативными, то есть выполняются слева направо. Поэтому выражение 10 / 5 * 2 необходимо трактовать как (10 / 5) * 2 , то есть результатом будет 4.

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 добавляется в нее.

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

Читать еще:  Паскаль обучение задачи
Ссылка на основную публикацию
Adblock
detector