Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операторы, вычисление значения и приоритет операторовСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте Операторы, вычисление значения и приоритет оператора
Понятие «Оператор»
В C# оператор — это элемент программы, который применяется к одному или нескольким операндам в выражении или операторе. Операторы, получающие на вход один операнд, например оператор инкремента (++) или new, называются унарными операторами. Операторы, получающие на вход два операнда, например, арифметические операторы (+, -, *, /) называются бинарными. Один оператор — условный оператор (?:) получает на вход три операнда и является единственным троичным оператором в C#. Следующая строка кода C# содержит один унарный оператор и один операнд. Оператор инкремента ++ изменяет значение операнда y.
y++;
Следующая строка кода C# содержит два бинарных оператора, каждый с двумя операндами. Оператор присвоения = в качестве операндов принимает целочисленную переменную y и выражение 2 + 3. Выражение 2 + 3 само состоит из оператора сложения и два операнда, 2 и 3:
y = 2 + 3;
Операторы, вычисление значения и приоритет операторов
Операнд может быть допустимым выражением любого размера, и он может состоять из любого числа других выражений. В выражении, которое содержит несколько операторов, порядок применения операторов определяется порядком применения операторов, ассоциативностью и скобками. Каждый оператор имеет определенный приоритет. В выражении, которое содержит несколько операторов с разными уровнями приоритета, порядок применения операторов определяет порядок, в котором вычисляются операторы. Например, следующий оператор присваивает 3 полю n1:
n1 = 11 - 2 * 4;
Умножение выполняется в первую очередь, так как умножение имеет приоритет над вычитанием. В следующей таблице операторы разделены на категории на основе типа выполняемых операций. Категории указаны в порядке приоритета:
Основные операторы
Унарные операторы
Мультипликативные операторы
Аддитивные операторы
Операторы сдвига
Операторы отношения и типа
Операторы равенства
Логические, условные операторы и NULL-операторы
Операторы назначения и анонимные операторы
Ассоциативность
Когда выражение содержит два или более операторов с одинаковым порядком применения, они вычисляются на основе ассоциативности. Запросы с левой ассоциативностью вычисляются слева направо. Например, x * y / z вычисляется как (x * y) / z. Запросы с правой ассоциативностью вычисляются справа налево. Например, оператор присваивания является право ассоциативным. Если бы это было не так, следующий код вызвал бы ошибку:
int a, b, c; c = 1; // Эквиваленты строчки ниже a = b = c; a = (b = c); // Ошибка //(a = b) = c;
Операторы присваивания и троичный оператор (?:) имеют правую ассоциативность. Все прочие двоичные операторы имеют левую ассоциативность. Независимо от того, используется ли для операторов в выражении левая ассоциация или правая ассоциация, сначала оцениваются операнд каждого выражения — слева направо. Следующие примеры иллюстрируют порядок оценки операторов и операндов:
13.
Можно изменить порядок, установленный приоритетом и ассоциативностью операторов, воспользовавшись скобками. Например, выражение 2 + 3 * 2 в обычном случае будет иметь значение 8, поскольку операторы умножения выполняются раньше операторов сложения. Однако если выражение записано в форме (2 + 3) * 2, сложение выполняется перед умножением и в результате получается 10.Следующие примеры иллюстрируют порядок оценки выражений в скобках. Как и в предыдущих примерах, операнды вычисляются до того, как применяется оператор:
Перегрузка операторов
Поведение операторов для пользовательских классов и структур можно изменить. Такой процесс называется перегрузкой операторов. В C# пользовательские типы могут перегружать операторы путём определения функций статических членов с помощью ключевого слова operator. Не все операторы могут быть перегружены, а для некоторых операторов есть ограничения:
Операторы сравнения можно перегружать, но только парами: если перегружен оператор ==, то != также должен быть перегружен. Обратный принцип также действителен и действует для операторов < и >, а также для <= и >=. Для перегрузки оператора в пользовательском классе нужно создать метод в классе с правильной сигнатурой. Метод нужно назвать «operator X», где X — имя или символ перегружаемого оператора. Унарные операторы имеют один параметр, а бинарные — два. В каждом случае один параметр должен быть такого же типа, как класс или структура, объявившие оператор, как показано в следующем примере:
public static Complex operator +(Complex c1, Complex c2)
15. Операторы преобразования
C# позволяет разработчикам объявлять операции преобразования классов или структур, делая тем самым возможным преобразование одних классов и структур в другие, а также в базовые типы или из них. Для задания преобразования используются операторы, называемые в соответствии с типом, к которому выполняется преобразование. Преобразуемый аргумент или результат преобразования (но не оба из них) должны принадлежать к содержащему типу:
class SampleClass { public static explicit operator SampleClass(int i) { SampleClass temp = new SampleClass(); // Код для преобразования из int в SampleClass... return temp; } }
Операторы преобразования обладают следующими свойствами:
Пользоваться операторами неявных преобразований проще, но операторы явных преобразований оказываются полезными в тех случаях, когда пользователь должен знать, что выполняется преобразование. В этом разделе описываются преобразования обоих типов.
В этом примере используется оператор явного преобразования. Этот оператор преобразует тип значения Byte в тип значения Digit. Поскольку в тип Digit могут быть преобразованы не все значения типа Byte, преобразование выполняется явным образом, что означает использование операции приведения, как показано в методе Main:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace LC_Console { struct Digit { byte value;
public Digit(byte value) // Конструктор { if (value > 9) { throw new System.ArgumentException(); } this.value = value; }
public static explicit operator Digit(Byte b) // Явное преобразование Byte в Digit { Digit d = new Digit(b); // Преобразование
Console.WriteLine("Преобразование прошло"); Console.WriteLine("Для продолжение нажмите любую клавишу... "); Console.ReadKey(); return d; } }
class TestExplicitConversion { static void Main() {
try { byte b = 3; Digit d = (Digit)b; // Преобразование } catch (System.Exception e) { Console.WriteLine("Поймали исключение: {0}", e); } } } } /* Выведет: * Преобразование прошло * Для продолжение нажмите любую клавишу... */
В этом примере демонстрируется неявное преобразование, в котором определяется оператор преобразования, выполняющий операцию, обратную описанной в предыдущем примере: преобразование значения типа Digit к целочисленному типу Byte. Поскольку к типу Byte можно преобразовать любое значение типа Digit, нет нужды делать преобразование явным для пользователя:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace LC_Console { struct Digit { byte value;
public Digit(Byte value) { if (value > 9) { throw new System.ArgumentException(); } this.value = value; }
public static implicit operator byte(Digit d) // Неявное преобразование Digit в Byte { Console.WriteLine("Преобразование прошло"); Console.WriteLine("Для продолжение нажмите любую клавишу... "); Console.ReadKey(); return d.value; // Неявное преобразование } }
class TestImplicitConversion { static void Main() { Digit d = new Digit(3); byte b = d; // Неявное преобразование } } } /* Выведет: * Преобразование прошло * Для продолжение нажмите любую клавишу... */
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2016-08-15; просмотров: 666; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.20 (0.011 с.) |