Скачиваний:
2
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

10 Выражения. Приоритет и ассоциативность операторов. Порядок вычисления выражения.

Комбинации операндов (переменных) и операций составляются в выражения. У разных операций будет разный порядок выполнения, что будет определяться двумя понятиями:

  • Приоритет – показатель, в соответствии с которым определяется порядок выполнения операций разного приоритета в выражении. Чем выше приоритет операции, тем раньше она производится в выражении. К примеру, умножение имеет более высокий приоритет, чем сложение, поэтому в выражении с этими двумя операторами в первую очередь будет произведено умножение, а потом сложение. Есть отдельная таблица с приоритетами для всех операций. В самом верху таблицы находятся операции типа выбора элемента из массива, а в самом её низу находятся условные операции и, упоминаемые только в том случае, если вы знаете, что это такое, операции для работы с лямбда-выражениями.

  • Ассоциативность – показатель, определяющий порядок выполнения операций с одинаковым приоритетом. Левая ассоциативность – выполнение операций слева направо, характерна почти для всех операций. Правая ассоциативность – выполнение операций справа налево, характерна только для операторов присвоения (х = у = а имеет вид х = (у = а)), оператора объединения со значением null (?? и ??= для возвращения операнда, если его значение не null), лямбда-выражения и условные операторы ?: (ставится после логического выражения с выбором из двух выходов для выполнения и невыполнения условия).

Стоит ещё указать, что помимо этих двух параметров порядок выполнения операций определяется наличием или отсутствием в выражении скобок. При ограничении выражения в скобки ограниченная скобками часть будет выполняться первой, обходя приоритет операторов.

Операнды (переменные) в выражении тоже имеют порядок, по которому они определяются. Операнды определяются самыми первыми слева направо по порядку выполнения операций. При появлении скобок операнды определяются слева направо до этих скобок, после чего определяются операнды внутри скобок, выполняются операции внутри скобок, а затем продолжается определение операндов.

Для примера порядок выполнения операций:

Выражение

Порядок

11 Преобразования типов. Иерархия численных типов. Явное и неявное преобразование типов. Возможные ошибки.

Явное и неявное преобразование типов. Возможные ошибки.

Поскольку код C# является статически типизированным во время компиляции, после объявления переменной ее нельзя объявить повторно или назначить ей значения другого типа, если этот тип невозможно неявно преобразовать в тип переменной. Например, string невозможно неявно преобразовать в int. Поэтому после объявления i как int нельзя назначить ей строку "Hello", как показано в следующем коде:

Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.

  • Неявные преобразования. Специальный синтаксис не требуется, так как преобразование всегда завершается успешно и данные не будут потеряны. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.

В случае с расширяющими преобразованиями компилятор за нас выполнял все преобразования данных, то есть преобразования были неявными (implicit conversion). Такие преобразования не вызывают каких-то затруднений. Тем не менее стоит сказать пару слов об общей механике подобных преобразований.

Если производится преобразование от безнакового типа меньшей разрядности к безнаковому типу большой разрядности, то добавляются дополнительные биты, которые имеют значени 0. Это называется дополнение нулями или zero extension.

1

2

byte a = 4;             // 0000100

ushort b = a;   // 000000000000100

Если производится преобразование к знаковому типу, то битовое представление дополняется нулями, если число положительное, и единицами, если число отрицательное. Последний разряд числа содержит знаковый бит - 0 для положительных и 1 для отрицательных чисел. При расширении в добавленные разряды компируется знаковый бит.

Рассмотрим преобразование положительного числа:

1

2

sbyte a = 4;            // 0000100

short b = a;    // 00000000000010

Преобразование отрицательного числа:

1

2

sbyte a = -4;           // 1111100

short b = a;    // 111111111111100

Явные преобразования (приведения). Для явных преобразований требуется выражение приведения. Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.

Иерархия численных типов.

В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:

Простые численные: sbytе, byte, short, ushort, int, uint, long, ulong, char, float, double , bool, decimal

Интегральные типы. C # поддерживает девять целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong, и char.

C # поддерживает два типа с плавающей запятой: floatи double.

Десятичный тип decimal.

Тип Bool представляет булевы логические величины. Возможные значения типа boolявляются trueи false.

Тип перечисления – это отдельный тип с именованными константами. Каждый тип перечисления имеет базовый тип, который должен быть byte, sbyte, short, ushort, int, uint, longили ulong.

Обнуляемые типы. Тип, допускающий значение NULL, может представлять все значения своего базового типа плюс дополнительное значение NULL. Записывается тип, допускающий значение NULL T, где T- базовый тип.