
- •Предисловие
- •Объектная ориентация программ на C#
- •1.1. Типы, классы, объекты
- •1.2. Программа на C#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Типы в языке C#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов C#
- •2.3. Простые типы. Константы-литералы
- •2.4. Объявления переменных и констант базовых типов
- •Операции и целочисленные выражения
- •3.1. Операции языка C#
- •3.2. Операции присваивания и оператор присваивания
- •3.3. Операции инкремента (++) и декремента (--)
- •3.4. Выражения с арифметическими операциями
- •3.5. Поразрядные операции
- •Выражения с операндами базовых типов
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •5.2. Простые (базовые) типы C# как классы
- •Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •6.6. Переключатель
- •Массивы
- •7.1. Одномерные массивы
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •7.5. Массивы массивов и поверхностное копирование
- •Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •8.3. Операции над строками
- •8.5. Форматирование строк
- •8.6. Строка как контейнер
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •8.10. Аргументы метода Main()
- •Методы C#
- •9.2. Соотношение фиксированных параметров и аргументов
- •9.3. Параметры с типами ссылок
- •9.4. Методы с переменным числом аргументов
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •9.7. Применение метода Array.Sort()
- •Класс как совокупность статических членов
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •11.5. Ссылка this
- •11.6. Конструкторы объектов класса
- •11.7. Деструкторы и финализаторы
- •Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •12.3. Автореализуемые свойства
- •12.4. Индексаторы
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Включение, вложение и наследование классов
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Интерфейсы
- •14.1. Два вида наследования в ООП
- •14.2. Объявления интерфейсов
- •14.3. Реализация интерфейсов
- •14.4. Интерфейс как тип
- •14.5. Интерфейсы и наследование
- •Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •15.5. Реализация структурами интерфейсов
- •Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •16.7. Пользовательские классы исключений
- •Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •17.3. Многоадресные групповые экземпляры делегатов
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Литература
- •Предметный указатель

30 |
Г л а в а 2 |
|
|
3.Укажите назначение десятичного типа и правила записи его констант.
4.Назовите способы записи символьных констант.
5.Приведите примеры эскейп-последовательностей.
6.Назовите размеры (в битах) представления в памяти констант базовых типов.
7.Какие символы допустимы в идентификаторах C#?
8.Приведите примеры служебных слов языка C#.
9.Является ли идентификатор Main служебным словом?
10.Что такое инициализация переменной?
11.Чем именованная константа отличается от константы-литерала?
Операции и целочисленные выражения
3.1.Операции языка C#
Впредыдущей главе мы ввели понятие типа и рассмотрели классификацию типов, принятую в языке C#. Привели сведения
определьных значениях констант и переменных базовых типов. Тем самым для базовых типов определена совокупность допустимых значений. Чтобы полностью охарактеризовать базовые типы, требуется рассмотреть допустимые для них операции.
Набор операций языка C# весьма велик и рассматривать возможности каждой из них мы будем постепенно по мере необходимости. Однако, предварительно приведем список операций, разместив их в порядке уменьшения их приоритетов (табл. 3.1 и 3.2)
Таблица 3 . 1 .
Операции, ассоциативные слева – направо
Базовые (первичные) операции
.Выбор члена (класса или объекта)
( ) |
Вызов метода или делегата |
[ ] |
Доступ по индексу (индексирование) |
++Постфиксный инкремент
- - |
Постфиксный декремент |
new |
Создание объекта (создание экземпляра) |
typeof |
Идентификация типа |
sizeof |
Определение размера операнда (только в опасном |
|
коде) |
checked |
Контроль за переполнениями в выражениях |
unchecked |
Отмена контроля за переполнениями в выражениях |
–> |
Доступ к члену (объекта) по указателю (только в |
|
опасном коде) |
|
|
|
Унарные операции |
+Унарный плюс (задание знака)
-Унарный минус (задание знака)
++Префиксный инкремент

32 Г л а в а 3
Продолжение
|
Унарные операции |
|
|
|
|
- - |
Префиксный декремент |
|
~ |
Поразрядное отрицание |
|
! |
Логическое отрицание |
|
(тип) |
Приведение к заданному типу |
|
& |
||
Получение адреса (только в опасном коде) |
||
* |
||
Разыменование указателя (только в опасном коде) |
||
|
||
|
|
|
|
Арифметические бинарные операции |
|
|
|
|
* |
Умножение |
|
/ |
Деление |
|
% |
Получение остатка при целочисленном делении |
|
|
|
|
+ |
Сложение |
|
- |
Вычитание |
|
|
|
|
|
Операции поразрядных сдвигов |
|
|
|
|
>> |
Поразрядный сдвиг вправо |
|
<< |
Поразрядный сдвиг влево |
|
|
|
|
|
Операции отношений (сравнений) |
|
|
|
|
< |
Меньше |
|
> |
Больше |
|
<= |
Меньше или равно |
|
>= |
Больше или равно |
|
is |
||
Сравнение типов (возвращает логическое значение) |
||
as |
||
Проверка типов (возвращает тип или null) |
||
|
||
|
|
|
== |
Сравнение на равенство |
|
!= |
Сравнение на неравенство |
|
?? |
Сравнение с null (поглощение null) |
|
|
|
|
|
Поразрядные операции |
|
|
|
|
& |
Побитовое (поразрядное) И |
|
^ |
Побитовое (поразрядное) исключающее ИЛИ |
|
| |
Побитовое (поразрядное) ИЛИ |
|
|
|
|
|
Логические бинарные операции |
|
|
|
|
& |
Конъюнкция (логическое И) |
|
|
|
Операции и целочисленные выражения |
33 |
|
|
Продолжение
|
Логические бинарные операции |
|
|
| |
Дизъюнкция (логическое ИЛИ) |
^ |
Исключающая дизъюнкция |
&& |
Условная конъюнкция |
|| |
Условная дизъюнкция |
|
|
|
Тернарная операция |
|
|
?: |
Условная операция |
|
|
Таблица 3 . 2 .
Операции присваивания (ассоциативные справа – налево)
=Присваивание
+= Сложение с присваиванием -= Вычитание с присваиванием *= Умножение с присваиванием /= Деление с присваиванием
%= Получение остатка от деления с присваиванием &= Поразрядное И с присваиванием ^= Поразрядное исключающее ИЛИ с присваиванием |= Поразрядное ИЛИ с присваиванием
>>= Поразрядный сдвиг вправо с присваиванием <<= Поразрядный сдвиг влево с присваиванием
В таблице 3.1. операции объединены в группы. В каждую группу помещены операции одного ранга. Операции из таблицы 3.1 выполняются слева направо, но это справедливо только для операций одного ранга. Например, x*y/z будет вычисляться в соответствии с выражением (x*y)/z.
Операции группы, размещенной выше, имеют более высокий ранг, чем операторы групп, размещенных ниже. Например, 2+6/2 равно 5, так как операция / имеет более высокий ранг, бинарная операция +. Начинающие программисты, забывая о приоритетах операций, иногда ошибаются, приводя для математического соотношения
a
b * c
34 |
Г л а в а 3 |
|
|
такое выражение: a/b*c. Его следует записать, используя скобки: a/(b*c), или без скобок a/b/c.
3.2. Операции присваивания и оператор присваивания
Операции присваивания, помещенные в табл. 3.2, имеют более низкий ранг (меньший приоритет), чем операции из табл. 3.1. Еще одна особенность операций присваивания состоит в том, что они выполняются справа – налево. У всех этих операций одинаковый ранг. Например, для выражения x=y=z=c с помощью скобок последовательность вычисления можно обозначить так: x=(y=(z=c)). Для сравнения отметим, что выражению x+y+z+c эквивалентно выражение
((x+y)+z)+c.
Присваивание – фундаментальное понятие программирования. Средства для выполнения присваивания существуют почти в каждом языке программирования.
Начнём с того, что в С# единичный знак = обозначает бинарную операцию (не оператор!). Формат применения операции присваивания:
имя_переменной = выражение
Конструкция имя_переменной = выражение, представляет собой бинарное выражение с двумя операндами. Последовательность обработки такого выражения следующая:
1)вычислить (получить) значение выражения;
2)присвоить полученное значение переменной;
3)вернуть в точку размещения выражения значение, присвоенное переменной.
Если конструкция имя_переменной = выражение завершается точкой с запятой и размещена в последовательности других операторов программы, то она превращается
воператор присваивания. В этом случае действие ограничивается двумя первыми пунктами: вычислить значение выражения и присвоить полученное значение переменной, поименованной слева от знака присваивания. Третий пункт не нужен – значение всего выражения с операцией присва-
Операции и целочисленные выражения |
35 |
|
|
ивания игнорируется. Однако, иногда удобно использовать цепочки присваиваний, и в этом случае для всех выражений присваивания, размещённых справа, их значения используются явно.
Пример:
int a, b, c, d; a=b=c=d=842;
После выполнения такого оператора переменные a, b, c, d принимают одно и то же значение 842. Последовательность вычислений: вычисляется выражение d=842, тем самым переменная d становится равной 842, и это же значение принимает участие в следующем выражении присваивания, где левым операндом служит переменная c, и т.д.
Кроме обычной операции присваивания, в С# есть составные операции присваивания, общую форму которых можно представить так:
бинарная_операция =
Здесь бинарная_операция — это одна из следующих арифметических и логических операций:
+ сложение, - вычитание, * умножение, / деление,
% получение остатка целочисленного деления, & поразрядная конъюнкция, | поразрядная дизъюнкция,
^ поразрядное исключающее ИЛИ, >> поразрядный сдвиг вправо битового представления
значения операнда, << поразрядный сдвиг влево битового представления
значения операнда.
Назначение составных операций присваивания – упростить запись и ускорить вычисление выражений присваивания, в которых левый операнд (переменная) одновременно используется в качестве левого операнда выражения, расположенного справа от операции присваивания.
36 |
Г л а в а |
3 |
|
|
|
Пример оператора присваивания |
Эквивалентный по результату |
|
|
с традиционной операцией: |
оператор: |
|
n=n+48; |
n+=48; |
Традиционный оператор, запись |
Применение составной |
|
|
которого можно упростить: |
операции присваивания: |
|
n=n/(n*n); |
n/=n*n; |
3.3. Операции инкремента (++) и декремента (--)
Сокращёнными формами операции присваивания можно считать операции автоувеличения (инкремент) ++ и автоуменьшения (декремент) --.
Операция инкремента ++ увеличивает на 1 значение операнда. Операция декремента -- уменьшает на 1 значение операнда.
Обе операции имеют префиксную и постфиксную формы. Префиксная форма предусматривает изменение значения операнда до использования этого значения. Постфиксная изменяет значение операнда после использования этого значения.
Пример:
int zone = 240, res; // Объявление двух переменных res = zone++; //Эквивалент: res=zone; zone=zone+1; res =++zone; // Эквивалент: zone=zone+1; res=zone;
Значение res после выполнения всех этих операторов равно 242. Операндом для операций ++ и -- может быть только леводопустимое неконстантное выражение (например, переменная). Следовательно, ошибочными будут выражения 84--,++0,
(n-12)++, --(x+y) и им подобные.
Отметим, что операции ++ и -- применимы к операндам всех базовых типов значений за исключением логического (bool).
3.4. Выражения с арифметическими операциями
Кроме операций инкремента и декремента, для целочисленных операндов определены, во-первых, стандартные арифметические операции:
Операции и целочисленные выражения |
37 |
|
|
●●унарные - и + (определяют знак выражения); ●●бинарные -, +, *, / (вычитание, сложение, умножение,
деление).
Среди них заслуживает пояснения только операция деления
– ее результат при двух целочисленных операндах всегда округляется до наименьшего по абсолютной величине целого значения.
// 03_01.cs – целочисленное деление using System;
class Program
{
static void Main()
{
Console.WriteLine("-13/4 = " + -13 / 4); Console.WriteLine("15/-4 = " + 15 /-4); Console.WriteLine("3/5 = " + 3 / 5);
}
}
Обратите внимание на аргумент метода WriteLine(). Это выражение с операцией конкатенации строк +. Первая строка
– изображение некоторого выражения. Вторая строка – строковое представление результата вычисления арифметического выражения, например, -13/4.
Результат выполнения программы:
-13/4 = -3 15/-4 = -3 3/5 = 0
Отдельно следует рассмотреть операцию получения остатка от деления целочисленных операндов %. При ненулевом делителе для целочисленных величин выполняется соотношение:
(x / y * y +x % y) равно x.
Пример:
// 03_02.cs – получение остатка от деления using System;
class Program