1 ©Павловская Т.А. Язык С# Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
2 ©Павловская Т.А. Язык С# Лекция 3. Переменные, операции, выражения Правила описания переменных и именованных констант, основные операции языка и их приоритеты, правила записи выражений, введение в обработку исключительных ситуаций.
©Павловская Т.А. (СПбГУ ИТМО) 3 using System; namespace A { class Class1 { static void Main() { // описания и операторы, например: Console.Write("Превед медвед "); } // описания } Структура простейшей программы на С#
©Павловская Т.А. (СПбГУ ИТМО) 4 Переменные Переменная это величина, которая во время работы программы может изменять свое значение. Все переменные, используемые в программе, должны быть описаны. Для каждой переменной задается ее имя и тип: intnumber; floatx, y; charoption; Тип переменной выбирается исходя из диапазона и требуемой точности представления данных.
©Павловская Т.А. (СПбГУ ИТМО) 5 Общая структура программы на С# пространство имен Класс А Класс В Метод Main Переменные класса Методы класса: Переменные класса Локальные переменные Методы класса: …
©Павловская Т.А. (СПбГУ ИТМО) 6 Область действия и время жизни переменных Переменные описываются внутри какого-л. блока (класса, метода или блока внутри метода) Блок это код, заключенный в фигурные скобки. Основное назначение блока группировка операторов. Переменные, описанные непосредственно внутри класса, называются полями класса. Переменные, описанные внутри метода класса, называются локальными переменными. Область действия переменной - область программы, где можно использовать переменную. Область действия переменной начинается в точке ее описания и длится до конца блока, внутри которого она описана. Время жизни: переменные создаются при входе в их область действия (блок) и уничтожаются при выходе.
©Павловская Т.А. (СПбГУ ИТМО) 7 Инициализация переменных При объявлении можно присвоить переменной начальное значение (инициализировать). intnumber = 100; floatx = 0.02; charoption = ю; При инициализации можно использовать не только константы, но и выражения главное, чтобы на момент описания они были вычислимыми, например: int b = 1, a = 100; int x = b * a + 25; Поля класса инициализируются «значением по умолчанию» (0 соответствующего типа). Инициализация локальных переменных возлагается на программиста. Рекомендуется всегда инициализировать переменные при описании.
©Павловская Т.А. (СПбГУ ИТМО) 8 Пример описания переменных using System; namespace CA1 { class Class1 { static void Main() { int i = 3; double y = 4.12; decimal d = 600m; string s = "Вася"; }
©Павловская Т.А. (СПбГУ ИТМО) 9 Именованные константы Вместо значений констант можно (и нужно!) использовать в программе их имена. Это облегчает читабельность программы и внесение в нее изменений: constfloat weight = 61.5; constint n = 10; constfloat g = 9.8;
©Павловская Т.А. (СПбГУ ИТМО) 10 Выражения Выражение правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами выражения могут быть константы, переменные и вызовы функций. Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Результатом выражения всегда является значение определенного типа, который определяется типами операндов. Величины, участвующие в выражении, должны быть совместимых типов. t + Math.Sin(x)/2 * x результат имеет вещественный тип a 0 && y < 0 результат имеет логический тип
©Павловская Т.А. (СПбГУ ИТМО) 11 Ассоциативность выражений Слева направо a + b – c + d ( ( ( a + b ) – c ) + d ) a * b / c * d ( ( ( a * b ) / c ) * d ) Справа налево a = b = c = d ( a = ( b = ( c = d ) ) )
©Павловская Т.А. (СПбГУ ИТМО) Первичные (), [], ++, --, new, … 2. Унарные ~, !, ++, --, -, … 3. Типа умножения (мультипликативные) *, /, % 4. Типа сложения (аддитивные) +, - 5. Сдвига > 6. Отношения и проверки типа, is, … 7. Проверки на равенство ==, != 8. Поразрядные логические &, ^, | 9. Условные логические &&, || 10. Условная ?: 11. Присваивания =, *=, /=,… Приоритеты операций C#
©Павловская Т.А. (СПбГУ ИТМО) 13 Тип результата выражения Если операнды, входящие в выражение, одного типа, и операция для этого типа определена, то результат выражения будет иметь тот же тип. Если операнды разного типа и (или) операция для этого типа не определена, перед вычислениями автоматически выполняется преобразование типа по правилам, обеспечивающим приведение более коротких типов к более длинным для сохранения значимости и точности. Автоматическое (неявное) преобразование возможно не всегда, а только если при этом не может случиться потеря значимости. Если неявного преобразования из одного типа в другой не существует, программист может задать явное преобразование типа с помощью операции (тип)x.
©Павловская Т.А. (СПбГУ ИТМО) 14 Неявные арифметические преобразования типов в C# sbyte short int ushort long byte uint float ulong double decimal char
©Павловская Т.А. (СПбГУ ИТМО) 15 Введение в исключения При вычислении выражений могут возникнуть ошибки (переполнение, деление на ноль). В C# есть механизм обработки исключительных ситуаций (исключений), который позволяет избегать аварийного завершения программы. Если в процессе вычислений возникла ошибка, система сигнализирует об этом с помощью выбрасывания (генерирования) исключения. Каждому типу ошибки соответствует свое исключение. Исключения являются классами, которые имеют общего предка класс Exception, определенный в пространстве имен System. Например, при делении на ноль будет выброшено исключение DivideByZeroException, при переполнении исключение OverflowException.
©Павловская Т.А. (СПбГУ ИТМО) 16 Инкремент и декремент using System; namespace CA1 { class C1 { static void Main() { int x = 3, y = 3; Console.Write( "Значение префиксного выражения: " ); Console.WriteLine( ++x ); Console.Write( "Значение х после приращения: " ); Console.WriteLine( x ); Console.Write( "Значение постфиксного выражения: " ); Console.WriteLine( y++ ); Console.Write( "Значение у после приращения: " ); Console.WriteLine( y ); }}} Результат работы программы: Значение префиксного выражения: 4 Значение х после приращения: 4 Значение постфиксного выражения: 3 Значение у после приращения: 4
©Павловская Т.А. (СПбГУ ИТМО) 17 Операция new Операция new служит для создания нового объекта. Формат операции: new тип ( [ аргументы ] ) С помощью этой операции можно создавать объекты как ссылочных, так и значимых типов, например: object z = new object(); int i = new int(); // то же самое, что int i = 0;
©Павловская Т.А. (СПбГУ ИТМО) 18 Операции отрицания using System; namespace ConsoleApplication1 { class Class1 { static void Main() { sbyte a = 3, b = -63, c = 126; bool d = true; Console.WriteLine( -a ); // Результат -3 Console.WriteLine( -c ); // Результат -126 Console.WriteLine( !d ); // Результат false Console.WriteLine( ~a ); // Результат -4 Console.WriteLine( ~b ); // Результат 62 Console.WriteLine( ~c ); // Результат -127 }}}
©Павловская Т.А. (СПбГУ ИТМО) 19 Явное преобразование типа long b = 300; int a = (int) b; // данные не теряются byte d = (byte) a; // данные теряются
©Павловская Т.А. (СПбГУ ИТМО) 20 Умножение Операция умножения (*) возвращает результат перемножения двух операндов. Стандартная операция умножения определена для типов int, uint, long, ulong, float, double и decimal. К величинам других типов ее можно применять, если для них возможно неявное преобразование к этим типам. Тип результата операции равен «наибольшему» из типов операндов, но не менее int. Если оба операнда целочисленные или типа decimal и результат операции слишком велик для представления с помощью заданного типа, генерируется исключение System.OverflowException
©Павловская Т.А. (СПбГУ ИТМО) 21 Результаты вещественного умножения *+y-y NaN +x+z-z+0-0+-NaN -x-z+z-0+0-+NaN NaN NaN
©Павловская Т.А. (СПбГУ ИТМО) 22 Пример using System; namespace ConsoleApplication1 { class Class1 { static void Main() { int x = 11, y = 4; float z = 4; Console.WriteLine( z * y ); // Результат 16 Console.WriteLine( z * 1e308 ); // Рез. "бесконечность" Console.WriteLine( x / y ); // Результат 2 Console.WriteLine( x / z ); // Результат 2,75 Console.WriteLine( x % y ); // Результат 3 Console.WriteLine( 1e-324 / 1e-324 ); // Результат NaN }}}
©Павловская Т.А. (СПбГУ ИТМО) 23 Операции сдвига Операции сдвига ( >) применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. При сдвиге влево ( >) освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае. Стандартные операции сдвига определены для типов int, uint, long и ulong.
©Павловская Т.А. (СПбГУ ИТМО) 24 Пример using System; namespace ConsoleApplication1 { class Class1 { static void Main() { byte a = 3, b = 9; sbyte c = 9, d = -9; Console.WriteLine( a 1 ); // Результат 4 Console.WriteLine( c >> 1 ); // Результат 4 Console.WriteLine( d >> 1 ); // Результат -5 }
©Павловская Т.А. (СПбГУ ИТМО) 25 Операции отношения и проверки на равенство Операции отношения (, >=, ==, !=) сравнивают первый операнд со вторым. Операнды должны быть арифметического типа. Результат операции логического типа, равен true или false. x == y -- true, если x равно y, иначе false x != y -- true, если x не равно y, иначе false x < y -- true, если x меньше y, иначе false x > y -- true, если x больше y, иначе false x = y -- true, если x больше или равно y, иначе false
©Павловская Т.А. (СПбГУ ИТМО) 26 Условные логические операции using System; namespace ConsoleApplication1 { class Class1 { static void Main() { Console.WriteLine( true && true ); // Результат true Console.WriteLine( true && false ); // Результат false Console.WriteLine( true || true ); // Результат true Console.WriteLine( true || false ); // Результат true }
©Павловская Т.А. (СПбГУ ИТМО) 27 Условная операция операнд_1 ? операнд_2 : операнд_3 Первый операнд выражение, для которого существует неявное преобразование к логическому типу. Если результат вычисления первого операнда равен true, то результатом будет значение второго операнда, иначе третьего операнда. using System; namespace ConsoleApplication1 { class Class1 { static void Main() { int a = 11, b = 4; int max = b > a ? b : a; Console.WriteLine( max ); // Результат 11 }}}
©Павловская Т.А. (СПбГУ ИТМО) 28 Присваивание – это замена старого значения переменной на новое. Старое значение стирается бесследно. Операция может использоваться в программе как законченный оператор. переменная = выражение a = b + c; x = 1; x = x + 0.5; Правый операнд операции присваивания должен иметь неявное преобразование к типу левого операнда, например: вещественная переменная = целое выражение; Операция присваивания 1 x
©Павловская Т.А. (СПбГУ ИТМО) 29 Сложное присваивание в C# x += 0.5; соответствует x = x + 0.5; x *= 0.5; соответствует x = x * 0.5; a %= 3; соответствует a = a % 3; a