Выбрать главу

Константы

Константы C# могут появляться, как обычно, в виде литералов и именованных констант. Вот пример константы, заданной литералом и стоящей в правой части оператора присваивания:

y = 7. 7 f;

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

Если возникает необходимость уточнить, как записываются литералы, то достаточно получить справку по этой теме. Делается все так же, как и в языке C++.

Всюду, где можно объявить переменную, можно объявить и именованную константу. Синтаксис объявления схож. В объявление добавляется модификатор const, инициализация констант обязательна и не может быть отложена. Инициализирующее выражение может быть сложным, важно, чтобы оно было вычислимым в момент его определения. Вот пример объявления констант:

/// <summary>

/// Константы

/// </summary>

public void Constants ()

{

     const int SmallSize = 38, LargeSize = 58;

     const int Midsize = (SmallSize + LargeSize)/2;

     const double pi = 3.141593;

     //LargeSize = 60; //Значение константы нельзя изменить.

     Console.WriteLine("MidSize= {0}; pi={1}",

         Midsize, pi);

}//Constants

6. Выражения. Операции в выражениях

Построение выражений. Операции и их приоритеты. Описание операций.

Выражения

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

• приоритет операций;

• для операций одного приоритета порядок применения — слева направо или справа налево;

• преобразование типов операндов и выбор реализации для перегруженных операций;

• тип и значение результата выполнения операции над заданными значениями операндов определенного типа.

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

Приоритет и порядок выполнения операций

Большинство операций в языке С#, их приоритет и порядок наследованы из языка C++. Однако имеются и различия: например, нет операции", ", позволяющей вычислять список выражений; добавлены уже упоминавшиеся операции checked и unchecked, применимые к выражениям.

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

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

Под перегрузкой операции понимается существование нескольких реализаций одной и той же операции. Большинство операций языка C# перегружены — одна и та же операция может применяться к операндам различных типов. Поэтому перед выполнением операции идет поиск реализации, подходящей для данных типов операндов. Замечу, что операции, как правило, выполняются над операндами одного типа. Если же операнды разных типов, то предварительно происходит неявное преобразование типа операнда. Оба операнда могут быть одного типа, но преобразование типов может все равно происходить — по той причине, что для заданных типов нет соответствующей перегруженной операции. Такая ситуация достаточно часто возникает на практике, поскольку, например, операция сложения не определена для младших подтипов арифметического типа. Приведу начальный фрагмент процедуры Express, предназначенной для анализа выражений.

/// <summary>

/// Анализ выражений

/// </summary>

public void Express()