Операции языка

Выражение есть правило вычисления нового значения. Оно строится из операндов (констант, переменных, функций), объединенных знаками операций и скобками. Частным случаем выражения является одиночный операнд. В табл. 6.1 перечислены операции С# в порядке убывания их приоритетов.

Таблица 6.1. Операции по категориям и их приоритет

Категория

Операции

Описание

Первичные операции

x.y f() a[x] x++ х-- new sizeof(t) typeof(t) checked(expr) unchecked(expr)

Получение поля, обращение к функции, получение члена массива, постфиксный инкремент, постфиксный декремент, получение объекта, определение размера, определение типа, создание проверяемого блока, создание непроверяемого блока

Унарные операции

+ - ! ~ ++x --x (T)x

Унарный плюс, унарный минус, логическое отрицание, инверсия разрядов, префиксный инкремент, префиксный декремент, преобразование типа

Мультипликативные операции

* / %

Умножение, деление, получение остатка от деления

Аддитивные операции

+ -

Сложение, вычитание

Сдвиговые операции

<< >>

Сдвиг влево, сдвиг вправо

Операции отношения и действий над типами

< <= < <= is as

Меньше, меньше или равно, больше, больше или равно, проверка принадлежности к типу, преобразование типа

Проверка эквивалентности

== !=

Равно, неравно

Логическое И

&

Логическое умножение

Логическое исключающее ИЛИ

^

Логическое исключение

Логическое ИЛИ

|

Логическое объединение

Условное И

&&

Условное умножение

Условное ИЛИ

||

Условное объединение

Условный оператор

?:

(См. пояснения далее)

Большинство операций, надеюсь, понятны, но некоторые нуждаются в пояснении.

Первичные операции постфиксных инкремента и декремента применяются к целочисленным переменным и работают следующим образом. Сначала в выражении используется текущее значение переменной, после чего это значение наращивается (инкремент) или уменьшается (декремент) на 1. Например:

int in1 = 1;

// Следующий оператор выведет 1 2 1:

Console.WriteLine("{0} {1} {2}", in1++, in1--, in1);

Первичные операции sizeof() и typeof() определены только над типами данных, причем первая может транслироваться только в том случае, когда в режиме компилятора указан флаг /unsafe, разрешающий создание ненадежного кода (в среде Visual Studio этот флаг устанавливается в диалоговом окне, открываемым командой Project4Properties). Операции checked() и unchecked() применяются к целочисленным выражениям. Первая включает, а вторая отключает режим проверки возможного переполнения при вычислении выражения expr. Если переполнение возникло в проверяемом выражении, возбуждается исключение System.ArithmeticOverflow. Если переполнение возникает в неконтролируемом выражении, ничего не происходит.

Унарная операция ! может применяться только к логическим операндам и означает инверсию значения (если операнд имел значение true, операция вернет false и наоборот). Унарная операция ~ применяется к целочисленным операндам и означает инверсию разрядов. Например:

Console.WriteLine("!0x{0:x8} = 0x{1:x8}", 8, ~8);

Console.WriteLine("!0x{0:x8} = 0x{1:x8}", -8, ~-8);

Этот фрагмент выведет такие строки:

!0х00000008 = 0хfffffff7

!0хfffffff8 = 0x00000007

Операции префиксного инкремента (декремент) сначала наращивают (уменьшают) значение целочисленной переменой на 1, а затем уже используют это значение.

Бинарные сдвиговые операции осуществляют сдвиг значения целочисленного выражения, указанного слева, на количество разрядов, определяемых значением выражения справа. Вытесненные из разрядной сетки (точнее, из диапазона значений целого типа) биты теряются. В листинге 6.1 представлена программа, иллюстрирующая сдвиговые операции (файл Ch06\ShiftDemo\Program.cs).

Листинг 6.1. Иллюстрация сдвиговых операций

using System;

 

class ShiftDemo

{

    public static string ByteToStr(int b)

    // Преобразование младшего байта b в двоичную форму

    {

        string s = "";        // Выходная строка

        int x = 128;          // Маска для разрядов, начиная со старшего

        for (int i = 1; i <= 8; i++) // Цикл преобразования 8-ми разрядов

        {

            if ((b & x) != 0) // Значащий разряд?

            s = s + '1';      // -Да

            else s = s + '0'; // -Нет

            x = x >> 1;       // Сдвигаем маску на разряд вправо

 

        }

        return s;

    }

 

    static void Main()

    {

        Console.WriteLine("Демонстрация сдвига:\n");

        int b = 1;

        for (int i = 1; i <= 8; i++)

        {

            Console.WriteLine("Значение байта {0,-3}; двоичная форма {1}",

                                                        b, ByteToStr(b));

            b = b << 1;

        };

        Console.ReadLine();

    }

}

Условная операция ?: является тернарной (она имеет три операнда):

<условие> ? <операнд_1> : <операнд_2>

Работает она следующим образом.

Первый операнд <условие> неявно преобразуется к типу bool. Если в результате преобразования он имеет значение true, вычисляется <операнд_1>, в противном случае — <операнд_2>. Результатом условной операции является вычисленное значение. Например:

int a = 1, b = 4, c;

c = (a > b) ? a : b ;    // c = 4

а = (c > 0) ? ++a : ++b; // a = 2

Предлагаю ознакомиться с аналогичными статьями: