Полный список операций языка С# в соответствии с их приоритетами (по убыванию приоритетов, операции с разными приоритетами разделены чертой) приведен в Приложении 1. В данном разделе мы подробно рассмотрим только часть операций, остальные операции будут вводиться по мере необходимости.
Замечание. Операции можно классифицировать по количеству операндов: унарные – воздействуют на один операнд, бинарные – воздействуют на два операнда, тернарные – воздействуют на три операнда. Некоторые символы используются для обозначения как унарных, так и бинарных операций. Например, символ «минус» используется как для обозначения унарной операции – арифметического отрицания, так и для обозначения бинарной операции вычитания. Будет ли данный символ обозначать унарную или бинарную операцию, определяется контекстом, в котором он используется.
1. Инкремент (++) и декремент(--).
Эти операции имеют две формы записи — префиксную, когда операция записывается перед операндом, и постфиксную – операция записывается после операнда. Префиксная операция инкремента (декремента) увеличивает (уменьшает) свой операнд и возвращает измененное значение как результат. Постфиксные версии инкремента и декремента возвращают первоначальное значение операнда, а затем изменяют его.
Рассмотрим эти операции на примере.
static void Main()
{
int i = 3, j = 4;
Console.WriteLine("{0} {1}", i, j);
Console.WriteLine("{0} {1}", ++i, --j);
Console.WriteLine("{0} {1}", i++, j--);
Console.WriteLine("{0} {1}", i, j);
}
|
Результат работы программы:
3 4
4 3
4 3
5 2
2. Операция new.
Используется для создания нового объекта. С помощью ее можно создавать как объекты ссылочного типа, так и размерные, например:
object z = new object();
int i = new int(); // то же самое, что и int i =0;
|
3. Отрицание:
1. Арифметическое отрицание (-) – меняет знак операнда на противоположный.
2. Логическое отрицание (!) – определяет операцию инверсии для логического типа.
Рассмотрим эти операции на примере.
static void Main()
{
int i = 3, j = -4;
bool a = true, b = false;
Console.WriteLine("{0} {1}", -i, -j);
Console.WriteLine("{0} {1}", !a, !b);
}
|
Результат работы программы:
-3 4
False True
4. Явное преобразование типа.
Используется для явного преобразования из одного типа в другой. Формат операции:
(<тип>) <выражение>;
Рассмотрим эту операцию на примере.
static void Main()
{
int i = -4;
byte j = 4;
int a = (int)j; //преобразование без потери точности
byte b = (byte)i; //преобразование с потерей точности
Console.WriteLine("{0} {1}", a, b);
}
|
Результат работы программы:
4 252
Замечание. В Pascal, C++ и других языках допускается неявное преобразование типов, которое в рамках предыдущего примера позволило бы записать: b=i. В этом случае происходит потеря точности вычислений, о чем компилятор либо "умалчивает", либо сообщает в виде предупреждения. Возможность неявного преобразования чревата вычислительными ошибками, которые очень трудно найти. Чтобы избежать подобных ошибок, в C# запрещены некоторые виды неявных преобразований. Более подробно преобразование типов мы рассмотрим в следующем разделе.
5. Умножение (*), деление (/) и деление с остатком (%).
Операции умножения и деления применимы для целочисленных и вещественных типов данных. Для других типов эти операции применимы, если для них возможно неявное преобразование к целым или вещественным типам. При этом тип результата равен «наибольшему» из типов операндов, но не менее int. Если оба операнда при делении целочисленные, то и результат тоже целочисленный.
Рассмотрим эти операции на примере.
static void Main()
{
int i = 100, j = 15;
double a = 14.2, b = 3.5;
Console.WriteLine("{0} {1} {2}", i * j, i / j, i % j);
Console.WriteLine("{0} {1} {2}", a * b, a / b, a % b);
}
|
Результат работы программы:
1500 6 10
49.7 4.05714285714286 0.1999999999999999
6. Сложение (+) и вычитание (-).
Операции сложения и вычитания применимы для целочисленных и вещественных типов данных. Для других типов эти операции применимы, если для них возможно неявное преобразование к целым или вещественным типам.
7. Операции отношения ( <, <=, >, >=, ==, !=).
Операции отношения сравнивают значения левого и правого операндов. Результат операции логического типа: true – если значения совпадают, false – в противном случае. Рассмотрим операции на примере:
static void Main()
{
int i = 15, j = 15;
Console.WriteLine(i < j); //меньше
Console.WriteLine(i <= j); //меньше или равно
Console.WriteLine(i > j); //больше
Console.WriteLine(i >= j); //больше или равно
Console.WriteLine(i == j); //равно
Console.WriteLine(i != j); //не равно
}
|
Результат работы программы:
False
True
False
True
True
False
8. Логические операции: И (&&), ИЛИ (||).
Логические операции применяются к операндам логического типа.
Результат логической операции И имеет значение истина тогда и только тогда, когда оба операнда принимают значение истина.
Результат логической операции ИЛИ имеет значение истина тогда и только тогда, когда хотя бы один из операндов принимает значение истина.
Рассмотрим операции на примере:
static void Main()
{
Console.WriteLine("x y x и y x или y");
Console.WriteLine("{0} {1} {2} {3}", false, false, false && false, false || false);
Console.WriteLine("{0} {1} {2} {3}", false, true, false && true, false || true);
Console.WriteLine("{0} {1} {2} {3}", true, false, true && false, true || false);
Console.WriteLine("{0} {1} {2} {3}", true, true, true && true, true || true);
}
|
Результат работы программы:
x y x и y x или y
False False False False
False True False True
True False False True
True True True True
Замечание. Фактически была построена таблица истинности для логических операций И и ИЛИ.
9. Условная операция.
Формат: (<операнд1>)? <операнд2> : <операнд3>;
Операнд1 – это логическое выражение, которое оценивается с точки зрения его эквивалентности константам true и false. Если результат вычисления операнда1 равен true, то результатом условной операции будет значение операнда2, иначе — операнда3. Фактически условная операция является сокращенной формой условного оператора if, который будет рассмотрен позже.
Пример использования условной операции:
static void Main()
{
int x = 5; int y = 10;
int max = (x > y) ? x : y;
Console.WriteLine(max);
}
|
10. Операции присваивания: =, +=, -= и т.д.
Формат операции простого присваивания (=):
операнд_2 = операнд_1;
В результате выполнения этой операции вычисляется значение операнда_1, и результат записывается в операнд_2. Можно связать воедино сразу несколько операторов присваивания, записывая такие цепочки: a=b=c=100. Выражение такого вида выполняется справа налево: результатом выполнения c=100 является число 100, которое затем присваивается переменной b, результатом чего опять является 100, которое присваивается переменной a.
Кроме простой операции присваивания существуют сложные операции присваивания, например, умножение с присваиванием (*=), деление с присваиванием (/=), остаток от деления с присваиванием (%=), сложение с присваиванием (+=), вычитание с присваиванием (-=) и т.д.
В сложных операциях присваивания, например, при сложении с присваиванием, к операнду_2 прибавляется операнд_1, и результат записывается в операнд_2. То есть, выражение с += а является более компактной записью выражения с = с + а .
ПРИЛОЖЕНИЕ 1. ОПЕРАЦИИ ЯЗЫКА С#
Операции языка С# приведены в порядке убывания приоритетов. Операции с разными приоритетами разделены чертой.
. |
Доступ к элементу |
x() |
Вызов метода или делегата |
x[] |
Доступ к элементу |
x++ |
Постфиксный инкремент |
x-- |
Постфиксный декремент |
new |
Выделение памяти |
typeof |
Получение типа |
checked |
Проверяемый код |
unchecked |
Непроверяемый код |
+ |
Унарный плюс |
- |
Арифметическое отрицание |
! |
Логическое отрицание |
~ |
Поразрядное отрицание |
++x |
Префиксный инкремент |
--x |
Префиксный декремент |
(тип) x |
Преобразование типа |
- |
Вычитание |
/ |
Деление |
% |
Остаток от деления |
<< |
Сдвиг влево |
>> |
Сдвиг вправо |
< |
Меньше |
> |
Больше |
<= |
Меньше или равно |
>= |
Больше или равно |
is |
Проверка принадлежности типу |
as |
Приведение типа |
& |
Поразрядное И |
^ |
Поразрядное исключающее ИЛИ |
| |
Поразрядное ИЛИ |
= |
Простое присваивание |
*= |
Умножение с присваиванием |
/= |
Деление с присваиванием |
%= |
Остаток от деления с присваиванием |
+= |
Сложение с присваиванием |
-= |
Вычитание с присваиванием |
<<= |
Сдвиг влево с присваиванием |
>>= |
Сдвиг вправо с присваиванием |
&= |
Поразрядное И с присваиванием |
^= |
Поразрядное исключающее ИЛИ с присваиванием |
|= |
Поразрядное ИЛИ с присваиванием |
|