Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций
Лекции по дисциплине "Программирование"
Лекция 1. Состав языка Типы данных Переменные и операции
Лекция 2. Линейные программы
Лекция 3. Простейшие операторы. Операторы ветвления
Лекция 4. Операторы цикла и передачи управления
Лекция 5. Обработка исключительных ситуаций
Лекция 6. Классы: основные понятия Описание класса
Лекция 7. Параметры методов
Лекция 8. Конструкторы и свойства
Лекция 9. . Массивы
Лекция 10. Символы и строки
Лекция 11 Дополнительные возможности методов. Индексаторы
Лекция 12. Операции класса. Деструкторы
Лекция 13. Наследование классов
Лекция 14. Интерфейсы
Лекция 15. Стандартные интерфейсы .NET
Лекция 16. Структуры и перечисления
Лекция 17. Делегаты
Лекция 18. События
const int b = 1;
const float x = 0.1, y = 0.1f; // const распространяется на обе переменные
Такие величины называют именованными константами, или просто константами. Они применяются для того, чтобы вместо значений констант можно было использовать в программе их имена. Это делает программу более понятной и облегчает внесение в нее изменений. Именованные константы должны обязательно инициализироваться при описании, например:
const int b = 1, a = 100;
const int x = b * a + 25;
Выражение — это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами простейшего выражения могут быть константы, переменные и вызовы функций.
Например, a + 2 — это выражение, в котором + является знаком операции, а a и 2 — операндами. Пробелы внутри знака операции, состоящей из нескольких символов, не допускаются. Операции C# приведены в таблице 3.1.
Таблица 3.1. Операции C# Категория | Знак операции | Название |
Первичные | x. | Доступ к элементу |
x() | Вызов метода или делегата | |
x[] | Доступ к элементу | |
x++ | Постфиксный инкремент | |
x-- | Постфиксный декремент | |
new | Выделение памяти | |
typeof | Получение типа | |
checked | Проверяемый код | |
unchecked | Непроверяемый код | |
Унарные | + | Унарный плюс |
- | Унарный минус (арифметическое отрицание) | |
! | Логическое отрицание | |
~ | Поразрядное отрицание | |
++x | Префиксный инкремент | |
--x | Префиксный декремент | |
(тип)x | Преобразование типа | |
Мультипликативные (типа умножения) | * | Умножение |
/ | Деление | |
% | Остаток от деления | |
Аддитивные (типа сложения) | + | Сложение |
- | Вычитание | |
Сдвиги | << | Сдвиг влево |
>> | Сдвиг вправо | |
Отношения и проверки типа | < | Меньше |
> | Больше | |
<= | Меньше или равно | |
>= | Больше или равно | |
is | Проверка принадлежности типу | |
as | Приведение типа | |
Проверки на равенство | == | Равно |
!= | Не равно | |
Поразрядные логические | & | Поразрядная конъюнкция (И) |
^ | Поразрядное исключающее ИЛИ | |
| | Поразрядная дизъюнкция (ИЛИ) | |
Условные логические | && | Логическое И |
|| | Логическое ИЛИ | |
Условная | ? : | Условная операция |
Присваивания | = | Присваивание |
*= | Умножение с присваиванием | |
/= | Деление с присваиванием | |
%= | Остаток отделения с присваиванием | |
+= | Сложение с присваиванием | |
-= | Вычитание с присваиванием | |
<<= | Сдвиг влево с присваиванием | |
>>= | Сдвиг вправо с присваиванием | |
&= | Поразрядное И с присваиванием | |
^= | Поразрядное исключающее ИЛИ с присваиванием | |
|= | Поразрядное ИЛИ с присваиванием |
Операции в выражении выполняются в определенном порядке в соответствии с приоритетами, как и в математике. В таблице 3.1 операции расположены по убыванию приоритетов, уровни приоритетов разделены в таблице горизонтальными линиями.
Результат вычисления выражения характеризуется значением и типом. Например, пусть a и b — переменные целого типа и описаны так:
int a = 2, b = 5;
Тогда выражение a + b имеет значение 7 и тип int, а выражение a = b имеет значение, равное помещенному в переменную a (в данному случае — 5) и тип, совпадающий с типом этой переменной.
Если в одном выражении соседствует несколько операций одинакового приоритета, операции присваивания и условная операция выполняются справа налево, остальные — слева направо. Для изменения порядка выполнения операций используются круглыескобки, уровень их вложенности практически не ограничен.
Например, a + b + c означает (a + b) + c, а a = b = c означает a = (b = c).
При вычислении выражений может возникнуть необходимость в преобразовании типов. Если операнды, входящие в выражение, одного типа, и операция для этого типа определена, то результат выражения будет иметь тот же тип.
Если операнды разного типа и (или) операция для этого типа не определена, перед вычислениями автоматически выполняется преобразование типа по правилам, обеспечивающим приведение более коротких типов к более длинным для сохранения значимости и точности. Автоматическое (неявное) преобразование возможно не всегда, а только если при этом не может случиться потеря значимости.
Если неявного преобразования из одного типа в другой не существует, программист может задать явное преобразование типа с помощью операции (тип)x. Его результат остается на совести программиста.
Правила неявного преобразования иллюстрирует рис. 3.1. Если один из операндов имеет тип, изображенный на более низком уровне, чем другой, то он приводится к типу второго операнда при наличии пути между ними. Если пути нет, возникает ошибка компиляции.
При вычислении выражений могут возникнуть ошибки, например, переполнение, исчезновение порядка или деление на ноль. В C# есть механизм, который позволяет обрабатывать подобные ошибки и таким образом избегать аварийного завершения программы. Он так и называется: механизм обработки исключительных ситуаций (исключений).
Если в процессе вычислений возникла ошибка, система сигнализирует об этом с помощью специального действия, называемого выбрасыванием (генерированием) исключения. Каждому типу ошибки соответствует свое исключение. Поскольку C# — язык объектно-ориентированный, исключения являются классами, которые имеют общего предка — класс Exception, определенный в пространстве имен System.
Например, при делении на ноль будет сгенерировано исключение DivideByZeroException, при недостатке памяти — исключение OutOfMemoryException.
Программист может задать способ обработки исключения в специальном блоке кода, начинающемся с ключевого слова catch («перехватить»), который будет автоматически выполнен при возникновении соответствующей исключительной ситуации. Внутри блока можно, например, вывести предупреждающее сообщение или скорректировать значения величин и продолжить выполнение программы. Если этот блок не задан, система выполнит действия по умолчанию, которые обычно заключаются в выводе диагностического сообщения и нормальном завершении программы. Обработка исключений подробно рассматривается позже.
В этом разделе кратко описаны синтаксис и применение всех операций C#, кроме некоторых первичных, которые рассматриваются позже при изучении соответствующего материала.
Операции инкремента (++) и декремента (--) увеличивают и уменьшают операнд на единицу. Они имеют две формы записи — префиксную, когда знак операции записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется.
Стандартные операции инкремента существуют для целых, символьных, вещественных и финансовых величин.
Операция new служит для создания нового объекта. Формат операции:
new тип ( [ аргументы ] )
С помощью этой операции можно создавать объекты как ссылочных, так и значимых типов, например:
object z = new object();
int i = new int(); // то же самое, что int i = 0;
При выполнении операции new сначала выделяется необходимый объем памяти (для ссылочных типов в хипе, для значимых — в стеке), а затем вызывается так называемый конструктор по умолчанию, то есть метод, с помощью которого инициализируется объект. Переменной значимого типа присваивается значение по умолчанию, которое равно нулю соответствующего типа.
Арифметическое отрицание (унарный минус -) меняет знак операнда на противоположный. Стандартная операция отрицания определена для типов int, long, float, double и decimal. К величинам других типов ее можно применять, если для них возможно неявное преобразование к этим типам
Логическое отрицание (!) определено для типа bool. Результат операции — значение false, если операнд равен true, и значение true, если операнд равен false.
Поразрядное отрицание (~), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении операнда типа int, uint, long или ulong.
Операция используется для явного преобразования величины из одного типа в другой. Это требуется в том случае, когда неявного преобразования не существует. При преобразовании из более длинного типа в более короткий возможна потеря информации. Формат операции:
( тип ) выражение
Здесь тип — это имя того типа, в который осуществляется преобразование, а выражение чаще всего представляет собой имя переменной, например:
long b = 300;
int a = (int) b; // данные не теряются
byte d = (byte) a; // данные теряются
Операция умножения (*) возвращает результат перемножения двух операндов. Стандартная операция умножения определена для типов int, uint, long, ulong, float, double и decimal. К величинам других типов ее можно применять, если для них возможно неявное преобразование к этим типам. Тип результата операции равен «наибольшему» из типов операндов, но не менее int.
Все возможные значения для вещественных операндов приведены в таблице 3.2. Символами х и y обозначены конечные положительные значения, символом z — результат операции вещественного умножения. Если результат слишком велик для представления с помощью заданного типа, он принимается равным значению «бесконечность», если слишком мал, он принимается за 0. NaN (not a number) означает, что результат не является числом.
Таблица 3.2. Результаты вещественного умножения * | +y | -y | +0 | -0 | +∞ | -∞ | NaN |
+x | +z | -z | +0 | -0 | +∞ | -∞ | NaN |
-x | -z | +z | -0 | +0 | -∞ | +∞ | NaN |
+0 | +0 | -0 | +0 | -0 | NaN | NaN | NaN |
-0 | -0 | +0 | -0 | +0 | NaN | NaN | NaN |
+∞ | +∞ | -∞ | NaN | NaN | +∞ | -∞ | NaN |
-∞ | -∞ | +∞ | NaN | NaN | -∞ | +∞ | NaN |
NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Операция деления (/) вычисляет частное от деления первого операнда на второй. Стандартная операция деления определена для типов int, uint, long, ulong, float, double и decimal. К величинам других типов ее можно применять, если для них существует неявное преобразование к этим типам. Тип результата определяется правилами преобразования, но не меньше int.
Если оба операнда целочисленные, результат операции округляется вниз до ближайшего целого числа. Если делитель равен нулю, генерируется исключение System.DivideByZeroException.
Если хотя бы один из операндов вещественный, дробная часть результата деления не отбрасывается, а все возможные значения приведены в таблице 3.3.
Таблица 3.3. Результаты вещественного деления / | +y | -y | +0 | -0 | +∞ | -∞ | NaN |
+x | +z | -z | +∞ | -∞ | +0 | -0 | NaN |
-x | -z | +z | -∞ | +∞ | -0 | +0 | NaN |
+0 | +0 | -0 | NaN | NaN | +0 | -0 | NaN |
-0 | -0 | +0 | NaN | NaN | -0 | +0 | NaN |
+∞ | +∞ | -∞ | +∞ | -∞ | NaN | NaN | NaN |
-∞ | -∞ | + | -∞ | +∞ | NaN | NaN | NaN |
NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |