Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 513; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.176.213 (0.009 с.) |