
- •3. Лекция: Выражения и операции
- •Выражения
- •Приоритет и порядок выполнения операций
- •Перегрузка операций и методов
- •Преобразования типов
- •Организация программного проекта ConsoleExpressions
- •Операции высшего приоритета
- •Выражения в скобках
- •Операция индексации a[I, j]
- •Операция new
- •Операции sizeof и typeof
- •Операции "увеличить" и "уменьшить" (increment, decrement)
- •Унарные операции приоритета 1
- •Операция кастинга - приведения к типу
- •Проверяемые и непроверяемые блоки и выражения
- •Арифметические операции
- •Вычисление выражений
- •Память и время - два основных ресурса
- •Именованные константы
- •Операции отношения
- •Операции проверки типов
- •Операции сдвига
- •Логические операции
- •Логические операции над булевскими операндами
- •Логические операции над булевскими операндами и целыми числами. Работа со шкалами
- •Условное выражение
- •Операция присваивания
- •Операция ?? - новая операция c# 2.0
- •Лямбда-оператор - новая операция в c# 3.0
- •Преобразования внутри арифметического типа
- •Выражения над строками. Преобразования строк
- •Преобразования строкового типа в другие типы
- •Метод Parse
- •Преобразование в строковый тип
- •Класс Convert и его методы
- •Класс Console и его методы
- •Методы Read и ReadLine
- •Вывод данных на консоль. Методы Write и WriteLine
- •Вычисление выражений. Оценка времени вычислений
- •Геометрические фигуры
- •Преобразования типов
- •Проекты
-
Проверяемые и непроверяемые блоки и выражения
У нас остались еще нерассмотренными две операции высшего приоритета - checked и unchecked. Начну с определения. Блок или выражение называется проверяемым (непроверяемым), если ему предшествует ключевое слово checked (unchecked). В проверяемых блоках контролируется вычисление арифметических операций и возникает исключительная ситуация, если, например, при вычислениях происходит переполнение разрядной сетки числа. В непроверяемых блоках такая исключительная ситуация будет проигнорирована, и вычисления продолжатся с неверным результатом.
Слегка модифицируем выше приведенный пример:
byte b1 = 100, b2 = 200, b3;
//b3 = b1 + b2;
b3 = (byte)(b1 + b2);
Если в предыдущем примере с байтами все вычисления были корректны, то теперь результат вычисления b3 просто не верен. При сложении был потерян старший разряд со значением 256, и b3 вместо 300 получит значение 44 из диапазона, допустимого для типа byte. Плохо, когда при выполнении программы возникает исключительная ситуация и программа не может далее нормально выполняться. Но еще хуже, когда программа завершает свою работу, выдавая неправильные результаты. Ложь хуже отказа. Кто виноват в возникшей ситуации? Программист, поскольку именно он разрешил опасную операцию, не позаботился о ее контроле и обработке исключительной ситуации в случае ее возникновения. Программист должен знать, что по умолчанию вычисления выполняются в режиме unchecked. А потому, если нет полной уверенности в возможности проведения преобразования, запись опасных преобразований должна сопровождаться введением проверяемых выражений, охраняемых блоков и сопровождающих их обработчиков исключительных ситуаций. Вот как может выглядеть корректно построенный код:
public void Days()
{
byte hotDays = 0, coldDays = 0, hotAndCold = 0;
const string HOW_HOT =
"Сколько жарких дней в этом году? (выше +25 градусов)";
const string HOW_COLD =
"Сколько холодных дней в этом году? (ниже -25 градусов)";
const string HOW_HOT_AND_COLD =
"В этом году жарких и холодных дней было ";
const string MESSAGE_ERROR =
"Данные не соответствуют типу в методе Days!";
try
{
Console.WriteLine(HOW_HOT);
hotDays = byte.Parse(Console.ReadLine());
Console.WriteLine(HOW_COLD);
coldDays = byte.Parse(Console.ReadLine());
hotAndCold = checked((byte)(hotDays + coldDays));
Console.WriteLine(HOW_HOT_AND_COLD +
hotAndCold.ToString());
}
catch (OverflowException)
{
Console.WriteLine(MESSAGE_ERROR);
}
}
В нормальной ситуации типа byte достаточно для задания числа дней в году, температура которых превосходит средние значения. Но данные вводит пользователь, он может ошибаться, он может вводить данные для Северного или Южного полюса. Поэтому все преобразования помещены в охраняемый блок, вычисления суммарного числа дней помещены в проверяемый блок, предусмотрен обработчик исключительной ситуации.