Операция, обозначаемая знаком =, называется операцией присваивания. Данная операция является бинарной, имеет два операнда. Например, X=Y. Операнд слева от знака может быть только переменной, объектом. Операнд справа может быть выражением, т.е. записью, в которой используются знаки других операций. Как правило, операция = является главной операцией, образующей оператор присваивания.
Имеется интересная особенность этой операции. Она допускает цепочку присваиваний. Например, X=Y=Z=10.
Арифметические операции
Различают 5 операций, выполняющих арифметические действия над числами (табл.3.2).
Таблица 3.2. Арифметические операции в C#
Операция | Назначение | Пример |
+ | Сложение | X = x + y |
- | Вычитание | X = x – y |
+ | Умножение | Z = x * y |
/ | Деление | Z = x / y |
% | Деление по модулю | Z = x % y |
Операция деления зависит от типа данных. Если тип данных, участвующих в операции, вещественный, то результат получится по правилам деления с целой и дробной частью. Если тип целый, то результатом деления также является целое число.
Деление по модулю возможно только для целых чисел. Оно обеспечивает получение остатка от деления двух целых чисел. Например, в результате операции 15 % 4 получится число 3. Таким образом, пара операций / и % обеспечивает для целых чисел специфическую возможность: можно получить и целую часть, и остаток от деления.
Арифметические операции можно объединять вместе с операцией присваивания, записывая две операции в виде одной. Это так называемая сокращённая форма записи.
Например, обычная запись: a = a + Stoim; сокращённая форма: a += Stoim;
К арифметическим операциям относятся две специфические операции – инкремент и декремент. Эти операции позволяют изменять значения переменных на 1. Инкремент – увеличивает, обозначается знаком ++. Декремент – уменьшает, обозначается знаком --. По сути дела, эти операции являются сокращённой формой записи для выражений типа
i = i +1 и i = i – 1. Например, вместо a = a + 1; можно записать: a++; (постфиксный вариант) или ++a; (префиксный вариант). Аналогично: --Prim; Prim--;
Между двумя последними формами нет никакой разницы, если эти операции являются единственными в записи выражения, т.е. используются самостоятельно. Если же речь идёт об использовании в сложном выражении, то приходится учитывать, когда на самом деле выполняются эти операции. Суть в том, что при постфиксном варианте записи значение переменной сначала используется, а потом изменяется на 1. При префиксном, наоборот, сначала изменяется, а потом используется.
Например:
t = 5; // t = 5
n = 4 * t++; // n = 20, t = 6
k = ++n / 3; // n = 21, k = 7
b = --k / t; // k = 6, b = 1
Поразрядные операции
В C# имеются операции, пригодные для обработки отдельных разрядов памяти (например, в видеопамяти графического дисплея). Такие операции называются поразрядными (операции с битами). Они позволяют изменять, считывать и сдвигать разряды в переменных. При этом переменная рассматривается не как число, а как комбинация двоичных разрядов, т.е. как логический код. Операция выполняется отдельно над каждым разрядом (табл.3.3).
Существует краткая форма поразрядных операций присваивания. Например: x &= y вместо x = x & y.
Поразрядные операции можно использовать только с целочисленными типами данных, к вещественным числам их применять нельзя.
Таблица 3.3. Поразрядные операции в C#
Операция | Назначение | Пример |
& | Поразрядное И | i & 16 |
| | Поразрядное ИЛИ | i | 12 |
^ | Поразрядное Исключающее ИЛИ | k^ 10 |
~ | Поразрядное НЕ | ~a |
>> | Поразрядный сдвиг влево | << 2 |
<< | Поразрядный сдвиг вправо | >> 2 |
Пример.
int k = 26;
k & 15 // 10
k | 15 // 31
k ^ 15; // 21
k << 2 // 104
k >> 2 // 6
// выделяем пятый бит в байте B, а остальные обнуляем
В = (B & 4);
Операции отношения
Все операции отношения используются для сравнения значений переменных или выражений. Эти операции вырабатывают значение булевского типа: ИСТИНА (true) или ЛОЖЬ (false). Численных эквивалентов для этих значений в языке C# не существует (табл.3.4).
Таблица 3.4. Операции отношения в C#
Операция | Назначение | Пример |
== | Равно | I == 0 |
!= | Не равно | K!= 15 |
> | Больше, чем | Z > 15.2 |
< | Меньше, чем | T < -132.654 |
>= | Больше или равно | Z11 > = 0 |
<= | Меньше или равно | Y2 <= 10 |
Сравнение ненулевых вещественных чисел, полученных путём вычислений, возможно только с определённой точностью. Это связано с формой представления вещественных чисел (формат с плавающей запятой). Точное сравнение вещественных чисел возможно только с нулём. Однако числа формата Decimal можно сравнивать между собой на равно.
Логические операции
В языке C# определены три логические операции (табл.3.5). Одна из них является унарной, так как имеет один операнд, а две – бинарными, так как имеют два операнда.
Табл.3.5. Логические операции в C#
Оператор | Описание |
! | Логическое отрицание. Изменяет логическое значение на противоположное |
&& | Логическое И. Результат равен true, только если оба операнда равны true |
|| | Логическое ИЛИ. Результат равен false, только если оба операнда равны false |
Все эти операторы возвращают результаты типа bool.
Важно помнить, что для логического равно (т. е. для ответа на вопрос «Верно ли, что что-то равно чему-то?») используется знак двойного равенства (==). Знак же одинарного равенства (=) используется для присваивания. Для знака == существует парный знак!= («не равно»).
Отметим, что в C#, в отличие от многих языков программирования, нельзя вместо false использовать 0, а вместо true – любое ненулевое число. Рассмотрим пример:
Class Program
{
...
static void Main (string [] args)
{
bool Param1 = true;
bool Param2 = false;
{
Console.WriteLine (! Param1);
// False
Console.WriteLine (Param1 && Param2);
// False
Console.WriteLine (Param1 || Param2);
// True
}
}
}
}
Такие операторы, как + (сложение), - (вычитание), * (умножение) и / (деление), записываются аналогично Object Pascal. Отметим только, что / (деление) применительно к целым числам дает целую часть от деления. Так, фрагмент
int k=100999, n=1000, s;
s=k/n;
Console.WriteLine (s.ToString())
выведет на экран 100, а не 101, т. е. никакого округления не происходит.
Оператор % является остатком от деления. Фрагмент
int k=100999, n=1000, s;
s=k%n;
Console.WriteLine (s.ToString());
выведет на экран 999.