Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
Константы
Константы C# могут появляться, как обычно, в виде литералов и именованных констант. Вот пример константы, заданной литералом и стоящей в правой части оператора присваивания:
y = 7. 7 f;
Значение константы "7.if" является одновременно ее именем, оно же позволяет однозначно определить тип константы. Заметьте, иногда, как в данном случае, приходится добавлять к значению специальные символы для точного указания типа. Я не буду останавливаться на этих подробностях.
Если возникает необходимость уточнить, как записываются литералы, то достаточно получить справку по этой теме. Делается все так же, как и в языке C++.
Всюду, где можно объявить переменную,
/// <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
{
//перегрузка операций
byte b1=1, b2 =2, Ь3;
short sh1;
int ini;
//b3 = b1 + Ь2; //ошибка: результат типа int
b3 = (byte) (b1+Ь2);
//sh1 = b1 + Ь2; //ошибка: результат типа int
sh1 = (short)(b1+b2);
in1 = b1+ b2 + sh1;
Console.WriteLine("Ь3= " + Ь3 + " sh1= "+ sh1 +" in1= " + in1);
}//Express
Разберем этот фрагмент. Начнем с первого закомментированного оператора присваивания b3=b1+Ь2;. Выражение здесь простейшее, включает одну бинарную операцию сложения. Оба операнда имеют тип byte, казалось бы, и результат должен быть типа byte и без помех присвоен переменной b3. Однако это не так. Для данных типа byte нет перегруженной реализации сложения. Ближайшей операцией является сложение целых типа int. Поэтому оба операнда преобразуются к типу int, выполняется операция сложения, результат имеет тип int и не может быть неявно преобразован в тип byte, — возникает ошибка еще на этапе компиляции. Корректная запись показана в следующем операторе. Аналогичная ситуация возникает, когда в левой части оператора стоит переменная типа short, — и здесь необходимо явное приведение к типу. Этого приведения не требуется, когда в левой части стоит переменная типа int.
Давайте разберем, как в данном примере организован вывод в методе WriteLine. До сих пор при вызове метода задавалось несколько параметров и использовалась форма вывода данных с подстановкой значений параметров в строку, заданную первым параметром. Здесь же есть только один параметр — это строка, заданная сложным выражением. Операция, многократно применяемая в этом выражении, это сложение " +". Операнды сложения имеют разный тип: левый операнд имеет тип string, правый — арифметический (byte, short, int). в этом случае арифметический тип преобразуется к типу string и выполняется сложение строк (конкатенация). Напомню, при преобразовании арифметического типа к типу string вызывается метод Tostring, определенный для всех встроенных типов. Результатом этого выражения является строка, она и будет результатом вывода метода WriteLine.
Полагаю, что разбор данного примера и материалы предыдущей лекции, где приводилась иерархия преобразований внутри арифметического типа и обсуждались вопросы выбора реализации перегруженного метода, дают необходимое представление о том, как работает перегрузка операций при вычислении выражений. В деталях, как всегда, может помочь справочная система.
С чего начинается выполнение выражения
Вычисление выражения начинается с выполнения операций высшего приоритета. Первым делом вычисляются выражения в круглых скобках — (ехрr), определяются значения полей объекта — х. у, вычисляются функции — f (х), переменные с индексами — а [i]. Выполнение этих операций достаточно понятно и не нуждается в комментировании. Операции checked и unchecked включают и выключают проверку преобразований арифметического типа в выражениях, которым они предшествуют. О других операциях этой категории скажу чуть подробнее.
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
рейтинг книги
Попаданка в академии драконов 2
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
рейтинг книги
Двойня для босса. Стерильные чувства
Любовные романы:
современные любовные романы
рейтинг книги
Кодекс Крови. Книга IV
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Здравствуй, 1984-й
1. Девяностые
Фантастика:
альтернативная история
рейтинг книги
Офицер-разведки
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
Институт экстремальных проблем
Проза:
роман
рейтинг книги
