Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

8. Арифметическое переполнение

Числовые выражения могут привести к переполнениям, если значение больше максимального значения типа значения.

Арифметические операторы (+, -, *, /) могут выдавать результаты, находящиеся за пределами интервала возможных величин используемого числового типа. С подробными сведениями следует знакомиться в разделе, посвященном определенному оператору, но, в общем, действуют следующие правила:

  • В случае переполнения целочисленной арифметической операции либо вызывается исключение OverflowException, либо отбрасываются старшие двоичные разряды результата. В случае деления целого числа на ноль всегда вызывается исключение DivideByZeroException.

  • В случае чисел с плавающей запятой при переполнении арифметической операции или делении на ноль исключение никогда не вызывается, потому что типы чисел с плавающей запятой основаны на стандарте IEEE 754 и включают правила для представления бесконечности и нечисловых значений (NaN).

  • В случае переполнения десятичной арифметической операции всегда вызывается исключение OverflowException. В случае десятичных чисел деление на ноль всегда вызывает исключение DivideByZeroException.

При возникновении целочисленного переполнения событие зависит от контекста выполнения, который может иметь значение checked или unchecked (проверяемый или непроверяемый).В случае проверяемого контекста вызывается исключение OverflowException. В случае непроверяемого контекста старшие разряды результата отбрасываются и выполнение программы продолжается. Таким образом, язык C# дает возможность выбора — обрабатывать или игнорировать переполнение.

Кроме арифметических операторов переполнение могут вызывать приведения целочисленного типа к целочисленному типу, например приведение типа long к типу int. На такие приведения распространяется проверяемое или непроверяемое выполнение. При этом битовые операции и операции сдвига никогда не вызывают переполнения.

9. Приоритет и ассоциативность операторов

Способ вычисления выражения управляется правилами ассоциативности и приоритетом операторов.

Большинство выражений, за исключением выражений назначения и выражений вызова метода, должны быть встроены в оператор.

10. Литералы и простые имена

Двумя наиболее простыми типами выражений являются литералы и простые имена. Литерал представляет собой постоянное значение, у которого нет имени. Например, в следующем примере 5 и «Hello, world!» являются литералами:

// Литералы

int i = 5;

string s = "Hello, world!";

В предыдущем примере i и s являются простыми именами, которые определяют локальные переменные. При использовании таких переменных в выражениях результатом вычисления имени переменной является значение, которое в данное время хранится в расположении переменой в памяти. Это показано в следующем примере:

int num = 5;

System.Console.WriteLine(num); // Выведет: 5

num = 6;

System.Console.WriteLine(num); // Выведет: 6

11. Выражения вызова

В следующем примере кода вызов метода DoWork является выражением вызова:

DoWork();

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

При вызове делегата указывается имя делегата и параметры метода в скобках.

Результатом вызова метода или делегата является возвращаемое методом значение, если метод вообще возвращает значение. В качестве значений в выражениях нельзя использовать методы, возвращающие значение типа void.