Операции языка C# и особенности их использования
В ряде учебников по языку C# операции языка называются операторами. Не претендуя на абсолютную истину, попробую не согласиться с этим утверждением. Всё-таки традиционно оператором считается не указание совершить действие, а выражение, описывающее законченное действие. Например, про выражение «a = b + c;» можно сказать, что это «оператор присваивания результата операции сложения двух чисел». Вряд ли правильно говорить, что это «оператор сложения». Исходя из данного соображения, я буду разделять операции и операторы.
1) Операция присваивания
Операция, обозначаемая знаком =, называется операцией присваивания. Данная операция является бинарной, имеет два операнда. Например, X=Y. Операнд слева от знака может быть только переменной, объектом. Операнд справа может быть выражением, т.е. записью в которой используются знаки других операций. Как правило, операция = является главной операцией, образующей оператор присваивания.
Имеется интересная особенность этой операции. Она допускает цепочку присваиваний. Например, X=Y=Z=10;
2) Арифметические операции
Различают 5 операций, выполняющих арифметические действия над числами.
Операция |
Назначение |
Пример |
+ |
Сложение |
X = x + y |
|
Вычитание |
X = x – y |
* |
Умножение |
Z = x * y |
/ |
Деление |
Z = x / y |
% |
Деление по модулю |
Z = t % e |
Выполнение первых трёх операций очевидно и не требует пояснения. А вот операция деления зависит от типа данных. Если тип данных, участвующих в операции, вещественный, то результат получится по правилам деления с целой и дробной частью. Если тип целый, то результатом деления также является целое число.
Деление по модулю возможно только для целых чисел. Оно обеспечивает получение остатка от деления двух целых чисел. Например, в результате операции 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
3) Поразрядные операции
В C# имеются операции, пригодные для обработки отдельных разрядов памяти (например, в видеопамяти графического дисплея). Такие операции называются поразрядными (операции с битами). Они позволяют изменять, считывать и сдвигать разряды в переменных. При этом переменная рассматривается не как число, а как комбинация двоичных разрядов, т.е. как логический код. Операция выполняется отдельно над каждым разрядом. Перечень поразрядных операций приведён в следующей таблице.
Операция |
Назначение |
Пример |
& |
Поразрядное И |
i & 16 |
| |
Поразрядное ИЛИ |
i | 12 |
^ |
Поразрядное Исключающее ИЛИ |
k ^10 |
~ |
Поразрядное НЕ |
~ a |
<< |
Поразрядный сдвиг влево |
<< 2 |
>> |
Поразрядный сдвиг вправо |
>> 2 |
Существует краткая форма поразрядных операций присваивания. Например:
x &= y вместо x = x & y
Поразрядные операции можно использовать только с целочисленными типами данных, к вещественным числам их применять нельзя!!!
Пример 1:
int k = 26;
k & 15 // 10
k | 15 // 31
k ^ 15; // 21
k << 2 // 104
k >> 2 // 6
Пример 2:
Выделить пятый бит в байте B, а остальные обнулить.
В = (B & 4);