Операторы checked и unchecked используются для управления контекстом проверки переполнения для арифметических операций и преобразований целого типа.
выражение_checked:
checked ( выражение )
выражение_unchecked:
unchecked ( выражение )
Оператор checked вычисляет содержащееся в нем выражение в проверяемом контексте.
Оператор unchecked — в непроверяемом. Используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа. В непроверяемом контексте арифметическое переполнение будет проигнорировано, а результат усечен.
В контексте checked для неконстантных выражений (выражений, которые вычисляются во время выполнения), возникает исключение System.OverflowException.
Пример использования оператора unchecked .
Явное преобразование из int к short, где
short | От -32 768 до 32 767 | 16-разрядное целое число со знаком | System.Int16 |
int | От -2 147 483 648 до 2 147 483 647 | 32-разрядное целое число со знаком | System.Int32 |
int i = 2147483647;
short ixx = unchecked((short)i);
Пример использования оператора checked.
Для неконстантных выражений (выражений, которые вычисляются во время выполнения), не заключенных в операторы или инструкции checked или unchecked, контекстом проверки переполнения по умолчанию является unchecked, если внешние факторы (например, переключатели компилятора и конфигурация среды исполнения) не заставляют установить контекст checked.
Пример.
int i = 2147483647;
short ixx = (short)i;
Если размер исходного типа превышает размер конечного, дополнительные самые старшие разряды исходного значения отбрасываются. Пример:
int i = 1000000;
short a = (short)i;
Console.WriteLine(a);
Если размер исходного типа меньше размера конечного, размер исходного значения расширяется до размера конечного типа за счет добавления знака или нулей.
short s = -72;
int i = (int) s;
Console.WriteLine(s);
Для преобразований из типа decimal к целому типу исходное значение округляется в сторону нуля до ближайшего целого значения. Результатом преобразования является полученное целое значение.
Пример.
decimal d = 10000.5m;
int i =(int)d;
Console.WriteLine(i);
Для типов с плавающей запятой и типа decimal отсутствует неявное преобразование, поэтому для преобразования между этими двумя типами следует использовать приведение. Пример.
Пример .
decimal myMoney = 99.9m;
double x = (double)myMoney;
Console.WriteLine(x);
Если убрать оператор явного преобразования, то программа завершится с ошибкой
Ошибка 1 Не удается неявно преобразовать тип "decimal" в "double". Существует явное преобразование (возможно, пропущено приведение типов)
Преобразования из double к float .
Значение типа double округляется до ближайшего значения типа float. При переполнении арифметической операции или делении на ноль исключение никогда не вызывается, потому что типы чисел с плавающей запятой основаны на стандарте IEEE 754 и включают правила для представления бесконечности и нечисловых значений (NaN).
Пример
double mydouble = 111111111111111111116666666666666666666666666666666666666666666666666666666666666666661111.11;
float x = (float)mydouble;
Console.WriteLine(x);
Явные преобразования ссылочных типов.
Поддерживаются следующие явные преобразования ссылочных типов:
· Из object любому другому ссылочному_типу.
· Из любого типа_класса S к любому типу_класса T, если S является базовым классом для T.
(Более подробно будет рассмотрено далее)
Пользовательские явные преобразования
будет рассмотрено далее
Преобразования с помощью вспомогательных классов.
Пример
int numVal = Convert.ToInt32("29");
Преобразования распаковки.
Преобразование распаковки обеспечивает явное преобразование ссылочного_типа к типу_значений.
Пример .
int i = 123;
object box = i;
i = 666;
i = (int)box;
Выражения.
Значения выражений.
Значение переменной — это значение, которое хранится в данный момент в расположении, указанном переменной.
Процесс определения значения операции на основе типа или значения составляющих выражений называют привязкой. Если значение операции определяется во время компиляции, то этот метод называется статической привязкой. Если выражение является динамическим, то это указывает на то, что любая участвующая привязка должна быть основана на типе времени выполнения. Привязка такой операции откладывается до времени выполнения операции при работающей программе. Это называется динамической привязкой.
Операторы
Выражения состоят из операндов и операторов. Операторы в выражении указывают, какие операции производятся с операндами. К операторам относятся, например, +, -, *, / и new. К операндам относятся, например, литералы, поля, локальные переменные и выражения. Операторы выражений, вычисляют значение и должны сохранить его в переменной.
Существует три типа операторов.
· Унарные операторы. У унарного оператора есть только один операнд и оператор может записываться в префиксной форме (например, –x) или постфиксной форме (например, x++).
· двоичные операторы; У бинарных операторов два операнда и они записываются в виде инфикса (например, x + y).
· Тернарный оператор. Существует только один тернарный оператор, ?:. В нем три операнда и используется инфиксная запись (c? x: y).
Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов.
Ассоциативностью операторов называют последовательность их выполнения. Операнды в выражении вычисляются слева направо.
Приоритет оператора задается в определении связанной с ним грамматической структуры. Например, аддитивное_выражение состоит из последовательности мультипликативных_выражений, разделенных операторами + или –, таким образом, операторы + или – имеют более низкий приоритет, чем операторы *, / и %.
В следующей таблице приводятся все операторы в соответствии с их приоритетом от самого высокого до самого низкого (спецификация языка C#).
Категория | Операторы |
Основной | x.y f(x) a[x] x++ x-- new (Создание объекта и делегата ) typeof default (Получение значения по умолчания для типа T) checked unchecked delegate |
Унарный | + - ! ~ ++x (Постфиксное приращение ) --x (Постфиксное уменьшение) (T)x |
Мультипликативный | * / % |
Аддитивный | + - |
Сдвиг | << >> |
Отношение и проверка типа | < > <= >= is as |
Равенство | == != |
Логическое И | & |
Исключающее ИЛИ | ^ |
Логическое ИЛИ | | |
Условное И | && |
Условное ИЛИ | || |
Условный | ?: int S = 0; int N = -10; S = N > 0 ? N : -N; Console.WriteLine(S); |
Присваивание и лямбда-выражение | = *= /= %= += -= <<= >>= &= ^= |= => |
· За исключением операторов присваивания все бинарные операторы обладают левой ассоциативностью. Это означает, что все операции выполняются слева направо. Например, выражение x + y + z вычисляется как (x + y) + z.
· Операторы присваивания и условный оператор (?:) обладают правой ассоциативностью. Это означает, что все операции выполняются справа налево. Например, выражение x = y = z вычисляется как x = (y = z).
Приоритетом и ассоциативностью можно управлять с помощью скобок.
Некоторые операторы допускают перегрузку.
Дата: 2019-07-30, просмотров: 243.