Операторы, типы операторов, выражения и виды операторов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операторы, типы операторов, выражения и виды операторов



Операторы, типы операторов, выражения и виды выражений

 

1. Справочная таблица операторов по категориям (со ссылками на MSDN)

 

Язык C# предоставляет большой набор операторов, которые представляют собой символы, определяющие операции, которые необходимо выполнить с выражением. Операции над целыми типами, такие как ==, !=, <, >, <=, >=, binary +, binary -, ^, &, |, ~, ++, -- и sizeof обычно разрешены в перечислениях. Кроме того, многие операторы могут перегружаться пользователем. Таким образом, их значение при применении к пользовательскому типу меняется.

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

Каждый оператор содержит ссылку на официальный источник информации по программированию на языке C#: MSDN, а конкретно в раздел Библиотека, Справочник по C# (http://msdn.microsoft.com/ru-ru/library/618ayhy6.aspx):

 

Категория оператора Операторы
Основные x.y f(x) a[x] x++ x-- new typeof checked unchecked default(T) delegate ->
Унарный + - ! ~ ++x --x (T)x true false & sizeof
Мультипликативные * / %
Аддитивные + -
Сдвиг (SHIFT) << >>
Относительные и тестирующие тип < > <= >= is as
Равенство == !=
Логическое И &
Логическое исключающее XOR ^
Логическое ИЛИ |
Условное AND &&
Условное OR ||
Поддержка значения NULL ??
Условная ?:
Присвоение и лямбда-выражение = += -= *= /= %= &= |= ^= <<= >>= => Лямбда-оператор

 

Типы операторов

 

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

Оператор может состоять из одной строки кода, которая заканчивается точкой с запятой, или из ряда однострочных операторов в блоке. Блок оператора заключен в скобки ({}) и может содержать вложенные блоки.

 

В приведённой ниже таблице перечислены различные типы операторов в C# и связанные с ними ключевые слова:

 

Категория Ключевые слова/примечания C#
Операторы объявления Оператор объявления представляет новую переменную или константу. Объявление переменной может при необходимости присвоить значение переменной. В объявлении константы необходимо назначение:   // Переменная double area; double radius = 2; // Константа const double pi = 3.14159;  
Операторы выражений Операторы выражений, вычисляющие значение, должны сохранить его в переменной^   // Выражение (присвоение) area = 3.14 * (radius * radius); // Ошибка. Нет объявления потому что не значение //circ * 2; // Выражение (вызов метода) Console.WriteLine(); // Выражение (создание нового объекта) System.Collections.Generic.List<string> strings = new System.Collections.Generic.List<string>();
Операторы выбора Операторы выбора позволяют ветвление на разные разделы кода, в зависимости от одного или нескольких заданных условий: if, else, switch, case
Операторы итерации Операторы итерации позволяют просмотр коллекций как массивов или многократное выполнение того же набора операторов до выполнения заданного условия: do, for, foreach, in, while
Операторы перехода Операторы перехода осуществляют передачу управления другому разделу кода: break, continue, default, goto, return, yield
Операторы обработки исключений Операторы обработки исключений позволяют аккуратно восстановиться после исключительных условий, возникающих во время выполнения.Дополнительные сведения см. в следующих разделах. throw, try-catch, try-finally, try-catch-finally
Операторы checked и unchecked Операторы checked и unchecked позволяют указать, позволено ли числовым операциям вызывать переполнение, когда результат сохраняется в переменной, которая слишком мала для хранения результирующего значения: checked и unchecked.
Оператор fixed Оператор fixed не позволяет сборщику мусора переносить перемещаемую переменную: fixed
Оператор lock Оператор lock позволяет ограничить одновременный доступ к блокам кода только до одного потока: lock
Помеченные операторы Оператор можно пометить и затем использовать ключевое слово goto для перехода к помеченному оператору
Пустой оператор Пустой оператор состоит из точки с запятой. Он не выполняет никаких действий и его можно использовать в местах, в которых оператор необходим, но нет необходимости в выполнении каких-либо действий. В следующем примере показаны два способа использования пустого оператора:   void ProcessMessages() { //... while (ProcessMessage()) ; }   void F() { //... if (done) goto exit; //... exit: ; }  

Внедрённые операторы

 

В некоторых операторах, включая do, while, for и foreach, всегда есть внедренный оператор, следующий за ними. Этот внедрённый оператор может быть либо одним оператором, либо несколькими операторами, заключенными в скобки ({}) в блоке оператора. Даже однострочные внедренные операторы могут быть заключены в скобки ({}), как показано в следующем примере:

 

// Рекомендуемый стиль блока

foreach (string s in System.IO.Directory.GetDirectories(

System.Environment.CurrentDirectory))

{

System.Console.WriteLine(s);

}

// Не рекомендуемый

foreach (string s in System.IO.Directory.GetDirectories(

System.Environment.CurrentDirectory))

System.Console.WriteLine(s);

 

Внедрённый оператор, не заключенный в скобки ({}), не может быть оператором объявления или помеченным оператором. Это показано в следующем примере:

if (pointB == true)

// Ошибка CS1023

int radius = 5;

 

Чтобы устранить ошибку, поместим внедрённый оператор в блок:

 

if (b == true)

{

// OK

DateTime d = System.DateTime.Now;

Console.WriteLine(d.ToLongDateString());

}

 

Вложенные блоки операторов

 

Блоки операторов могут быть вложенными, как показано в следующем коде:

 

foreach (string s in System.IO.Directory.GetDirectories(

System.Environment.CurrentDirectory))

{

if (s.StartsWith("CSharp"))

{

if (s.EndsWith("TempFolder"))

{

return s;

}

}

 

}

return "Not found.";

 

5. Недостижимые операторы

 

Если компилятор определяет, что поток управления ни при каких обстоятельствах не сможет достичь определенного оператора, то он выдаст предупреждение CS0162, как показано в следующем примере:

 

// Недостижимый код организуем так

const int val = 5;

if (val < 4)

{

System.Console.WriteLine("Я никогда ничего не напишу:(."); // CS0162: "Обнаружен недостижимый код"

}

 

Выражения

 

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

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

 

((x < 10) && (x > 5)) || ((x > 20) && (x < 25))

System.Convert.ToInt32("35")

 

7. Значения выражений

 

В большинстве контекстов, в которых используются выражения, например, в операторах или в параметрах методов, предполагается, что результатом вычисления выражения будет какое-то значение. Если x и y — целые числа, то результатом вычисления выражения x + y будет числовое значение. Результатом вычисления выражения new MyClass() будет ссылка на новый экземпляр объекта MyClass. Результатом вычисления выражения myClass.ToString() является строка, поскольку она является возвращаемым типом метода. Однако хотя имя пространства имён классифицируется как выражение, значение не будет результатом его вычисления и, поэтому, оно никогда не будет конечным результатом какого-либо выражения. Имя пространства имен нельзя передать параметру метода, или использовать его в новом выражении, или присвоить его переменной. Его можно использовать только как часть выражения в более крупном выражении. Это также относится к типам (в отличие от объектов System.Type), именам групп методов (в отличие от отдельных методов) и к методам доступа к событиям add и remove.

У каждого значения есть связанный с ним тип. Например, если x и y — переменные типа int, то значение выражения x + y также типизируется как int. Если значение присвоено переменной другого типа или если x и y принадлежат к разным типам, то применяются правила преобразования типов.

 

Таким образом, если в выражении присутствует переменная, свойство объекта или индексатор объекта, для вычисления выражения используется значение этого элемента. В C# выражение можно использовать везде, где требуется значение или объект, если результат вычисления выражения соответствует требуемому типу.

 

8. Арифметическое переполнение

 

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

 

Арифметические операторы (+, -, *, /) могут выдавать результаты, находящиеся за пределами интервала возможных величин используемого числового типа. С подробными сведениями следует знакомиться в разделе, посвященном определенному оператору, но, в общем, действуют следующие правила:

  • В случае переполнения целочисленной арифметической операции либо вызывается исключение OverflowException, либо отбрасываются старшие двоичные разряды результата. В случае деления целого числа на ноль всегда вызывается исключение DivideByZeroException.
  • В случае чисел с плавающей запятой при переполнении арифметической операции или делении на ноль исключение никогда не вызывается, потому что типы чисел с плавающей запятой основаны на стандарте IEEE 754 и включают правила для представления бесконечности и нечисловых значений (NaN).
  • В случае переполнения десятичной арифметической операции всегда вызывается исключение OverflowException. В случае десятичных чисел деление на ноль всегда вызывает исключение DivideByZeroException.

 

При возникновении целочисленного переполнения событие зависит от контекста выполнения, который может иметь значение checked или unchecked (проверяемый или непроверяемый).В случае проверяемого контекста вызывается исключение OverflowException. В случае непроверяемого контекста старшие разряды результата отбрасываются и выполнение программы продолжается. Таким образом, язык C# дает возможность выбора — обрабатывать или игнорировать переполнение.

Кроме арифметических операторов переполнение могут вызывать приведения целочисленного типа к целочисленному типу, например приведение типа long к типу int. На такие приведения распространяется проверяемое или непроверяемое выполнение. При этом битовые операции и операции сдвига никогда не вызывают переполнения.

 

9. Приоритет и ассоциативность операторов

 

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

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

 

10. Литералы и простые имена

 

Двумя наиболее простыми типами выражений являются литералы и простые имена. Литерал представляет собой постоянное значение, у которого нет имени. Например, в следующем примере 5 и «Hello, world!» являются литералами:

 

// Литералы

int i = 5;

string s = "Hello, world!";

 

В предыдущем примере i и s являются простыми именами, которые определяют локальные переменные. При использовании таких переменных в выражениях результатом вычисления имени переменной является значение, которое в данное время хранится в расположении переменой в памяти. Это показано в следующем примере:

 

int num = 5;

System.Console.WriteLine(num); // Выведет: 5

num = 6;

System.Console.WriteLine(num); // Выведет: 6

 

11. Выражения вызова

 

В следующем примере кода вызов метода DoWork является выражением вызова:

 

DoWork();

 

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

При вызове делегата указывается имя делегата и параметры метода в скобках.

 

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

Выражения запросов

 

Аналогичные правила в общем случае относятся и к выражениям запроса.

 

13. Лямбда-выражения

 

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

 

14. Деревья выражений

 

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

 

Дополнительные сведения о деревья выражений можно получить в разделе Деревья выражений (C# и Visual Basic) (http://msdn.microsoft.com/ru-ru/library/bb397951.aspx).



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 1430; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.190.101 (0.054 с.)