Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на C#. Часть 1. Учебное пособие
.pdf
1.5. ОБЪЯВЛЕНИЕ И ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ
Объявление переменной типа-значения в методе класса приводит к
созданию в памяти объекта соответствующего типа, возможно, проинициализированного определённым значением. Это значение может быть задано в
виде литерала соответствующего типа, либо в виде выражения.
Например, объявление переменной с и к имеет вид:
int с; // Объявление с.
int к; // Объявление к.
Предложение объявления мо
жет содержать р
азличные спецификаторы,
указание имени типа, имени объекта и выражения инициализации. Выражение инициализации может быть представлено литералом, либо выражением.
Ниже приведённые объявления равноценны:
int с;
System.Int32 с;
Формы записи операторов определения и инициализации переменных
типа значения имеют вид:
int с = 0;
int с = new int();
System.Int32 с = 0;
System.Int32 с = new System.Int32();
Не допускается испол
ьзования в выражениях неинициализированных
локальных переменных
.
Объявления констант сопровождаются дополнительным спецификатором const и требуют непосредственной инициализации. В примере константа
инициализируется литералом 9.8.
const floatg = 9.8;
Любой используемый в блоке программы объект вводится объявлением. Под блоком понимается множество предложений, заключённое в фигурные скобки. Объекты можно объявлять в любом месте блока. Точка объявления объекта соответствует месту её со
здания. Обращение к объекту
«выше»
11

точки её объявления лишено смысла. Новый блок представляет новую область видимости. Объекты, объявляемые во внутренних блоках, не видны во
внешних блоках. Объекты, объявленные в методе и во внешних блоках, видны и во внутренних блоках. Одноимённые объекты во вложенных областях
конфликтуют. Не допускается объявления одноимённых данных-членов в теле класса. В теле класса не допускает
пустыми списками параметров. Так же не допускают
ся объявления одноимённых методов с
ся объявления одноимённых методов со списками параметров, у которых совпадают типы параметров.
В программировании часто вместо понятия объект используется понятие переменная. Под переменной понимается расположение в памяти объекта
определённого типа. Для создания переменной необходи
мо
задать тип переменной и дать этому типу имя. Переменные могут принимать значения, которыми они проинициализированы, или эти значения могут быть получены
программно. Ниже приведён пример программы, в которой в первом случае
используется инициализация для присвоения значения переменной, во втором случае используется присвоение значения переменной с помощью оператора присвоения«=»:
Class Var
{
static void Main()
{
System
int my = 1
.Console.WriteLine ("Инициализированная переменная my:{0}",my);
0;
my=5;
System.Console.WriteLine ("Переменная my после присвоения значения: {0}",
my);
Console.ReadLine();
}
}
Результат работы этой программы будет следующий:
12

Инициализированная переменная my: 10
Переменная my после присвоения значения: 5
Здесь строка:
int my = 10;
означает объявление и инициализацию переменной my.
Строка:
my = 5 ;
означает присвоение переменной my значения 5.
Переменная, значение которой не может быть изменено, называется
константой. Константа гарантирует сохранение значения определённой переменной. Например, число pi приблизительно равно
3.1415926535897932384626433832795.
Если в программе имеется оператор
у = х*3.1415926535897932384626433832795;,
то для лучшей читаемости используется переменная, которая хранит значение pi.
В этом случае используем константу
constdoublepi = 3.1415926535897932384626433832795;
у = х * pi;
Различают три разновидности констант: литералы, символические константы и перечисления. Рассмотрим пример:
х = 100;
Значение 100 является литеральной константой. Символические константы устанавливают имя для постоянного значения. Ниже приведён синтаксис для создани
const тип
я константы:
идентификатор = значение;
Константа должна быть обязательно проинициализирована. Её значение не может быть изменено в программе.
const double pi = 3.1415926535897932384626433832795;
pi = 3.0; //недопустимая операция
Число 3.14... является литеральной константой, a pi – символической
константой типа double.
13

Перечисления – это особый тип значений, который состоит из набора
именованных констант. Предположим, что имеется список констант, содержащих цвета радуги. Если использовать константы, то объявление примет
вид: Красный, оранжевый, жёлтый, зелёный, голубой, синий, фиолетовый
const string rnRed=”Красный”;
const string rnOrange=”Оранжевый”;
const string rnYellow l=”Желтый”;
const string rnGreen=”Зеленый”;
const string rnBlue=”Голубой”;
const string rnIndigo=”Синий”;
const stringrnViolet=”Фиолетовый”;
Получились семь совершенно не связанных констант. Для установления логической связи в С# предусмотрен механизм перечислений:
enumRainbow
{ Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Фиолетовый }
Теперь семь символических констант являются элементами одного перечисления типа Rainbow.
Перечисление задаётся следующим образом:
[атрибуты] [модификаторы] enum идентификатор[: базовый тип] {список перечислений};
Перечисление объявляется с помощью ключевого слова enum, идентифицируется по имени и представляет собой непустой список неизменяемых именованных значений интегрального типа. Первое знач
ение в перечислении по
умолчанию инициализируется нулём. Каждое последующее значение отличается от предыдущего, по крайней мере, на единицу, если объявление значения не содержит явного дополнительного присвоения нового значения.
Пример объявления перечисления c явным указанием значения
приводится
ниже.
enum Colors { Red = 5, Green = 2, Blue = 4, Yellow = 8 };
14

Обращение к элементу перечисления осуществляется посредством
сложного выражения, состоящего из имени класса перечисления, операции
доступа к элементу перечисления '.', имени элемента перечисления:
intxVal = Colors.Red; //Переменная xVal инициализируется значением
перечисления.
enum Rainbow
{ Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Фиолетовый }
inti;
Rainbow Rn = Rainbow.Красный;
label1.Text = Rn.ToString();
i = (int)Rn;
label2.Text = i.ToString();
Теперь семь символических констант являются элемент
речислен
ия типа Rainbow. В этом примере Rn имеет значение Красный и это
ами одного пе-
слово появится на форме, а (int)Rn примет значение 0 и это число тоже поя-
вится на форме.
Перечисление является классом, поэтому в распоряжении программиста оказываются методы сравнения значений перечисления, методы преобразования з
начений п
еречисления в строковое представление, методы перевода
строкового представления значения в перечисление.
Если содержимое строки заключить в двойные кавычки, то получим
строковую константу. Например, константная строка «Привет». Инициализация строковой переменной str строковой константой запишется в следующем
виде:
str=“Привет”;
Объявление массивов вС# поясним на примерах.
Пример 1:
int [] к; //к-массив
k = new int [5
];//Опр
еделяем массив из 5 целых
// Задаем элементы массива
к[0] = –5; к[1] = –4; к[2] = 55;к[3] = 10; к[4] = 155;
15

//Выводим пятый элемент массива
Console.WriteLine(к[4].ToString());
Нумерация индексов в массиве начинается с 0.
Ниже приведены варианты неправильного объявления массивов:
int k[];
int k[4];
int [2]к;
Так как массив представляет собой ссылочный объект, то для создания
массива необходима строка
k = new int [5];,
которая определяет размер массива. Возможны конструкции вида
int [] k = new int [5];
или
int []
к = {–5, 4, 55, 10, 155};
Рассмотренные вы
ше конструкции применимы также и к другим ти-
пам. Двумерный массив объявляется следующим образом:
int [,] k = new int[4,5];.
Размерность массива определяется количеством запятых плюс один.
В приведённом примере массив k двухмерный, состоящий из 20 (=4*5) элементов (к[0,0] – первый, к[3,4] – последний).
По аналогии задаются и многомерные массивы:
int[,,] к = new int[6,6,6];.
Массивы можно ср
азу инициализировать:
int[,] r = {{1, –1},{4, –2},{3,5}};.
Рассмотренные вы
ше массивы называются прямоугольными.
1.6. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
Выражения определяют действия и последовательность вычисления
значения. Они могут состоять из констант, переменных, стандартных методов, разделённых скобками и знаками операций (см. табл. 1.3).
16

Порядок выполнения операций определяется скобками, а при их отсут-
ствии – согласно приоритету операций (см. табл. 1.4).
Одним из аспектов безопасности языка является приведение типов.
В программе типы характеризуются собственными диапазонами значений,
которые определяются свойствами типов. Области значений некоторых типов пересекаются, а некоторые значения можно выразить более чем одним
типом. Например, значение 12 можно представ
ить, как
значение типа sbyte,
byte, short, int, uint, ulong. В программе результаты этих преобразований
должны быть предсказуемы.
1.3. Категории операций
Категории операций Операции
Арифметические + – * / %
Логические (boolean и побитовые) & | ^ ! ~ && ||
Строковые (конкатенаторы) +
Increment, decrement ++ --
Сдвига >><<
Сравнения == != <><= >=
Присвоения
= += –= *= /= %= &= |= ^=
<<= >>=
Memberaccess
.
Индексации []
Cast (приведение типа) ()
Conditional (трёхоперандная) ?:
Delegate concatenation and removal
+ –
Создания объекта new()
Type information is sizeof typeof
Overflow exception control (управление исклю-
чениями)
checked unchecked
Indirection and Address (неуправляемый код) * –> [] &
17

1.4. Приоритет операций
Приоритет Операции
1 () [] . (постфикс)++ (постфикс)–– newsizeoftypeofunchecked
2 ! ~ (имя типа) +(унарный) –(унарный) ++(префикс) ––
(префикс)
3 * / %
4 + –
5 <<>>
6 <><= =>is
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += –= *= /= %= &= |= ^= <<= >>=
В одном выражении обычно присутствуют операнды различных типов.
Поэтому при определении значения выражения есть необходимость приведения значений операндов к некоторому «общему типу».
Если приведение значения к другому типу происходит автоматически,
то такие преобразования называются неявными.
В остальных случаях программист должен явным образом указывать
необходимость преобразования, используя выражения приведения типа или
обращая
сь к специальным методам преобразования, определённым в классе
System.Co
nvert, которые обеспечивают преобразование значения одного типа
к значению другого (в том числе, значения строкового типа к значениям базовых типов).
Различают расширяющее и сужающее преобразования типов. Расши-
ряющее преобразование типов считается безопасным, так как информация в
18

этом случае не искажается. Например, число, представленное в виде
32-разрядного целого числа со знаком, преобразуется в 64-разрядное целое
число со знаком.
Сужающее преобразование потенциально опасно потерей значения.
В этом случае значение одного типа преобразуется к значению другого типа,
которое имеет меньший размер. Например, преобразование 64-разрядного
целого числа со знаком в 32-разрядное целое чис
ло
со знаком. При сужающем преобразовании методами класса System.Convert потеря информации сопровождается генерацией исключения.
Ниже приведён пример неявного преобразования.
short z = 1;
int у = z; //неявное преобразование
При обратном преобразовании можно потерять информацию. Если зна-
чение в int больше, чем 32 767, то оно будет усечено при преобразовании.
Например, компилятор не станет выполнять неявное преобразование от
short z;
int у - 5;
z = у; //не скомпилируете
Для этого необходимо выполнить явное преобразование, используя
оператор приведения:
short z; int у - 5;
z = (short) у;//OK
1.7. ИНСТРУКЦИИ И РАЗДЕЛИТЕЛИ
Законченное выражение в коде программы называется инструкцией.
Последовательность инструкций есть программа. Инструкция заканчивается
точкой с запятой (;).
Ниже приведены инструкции объявления, присваивания и инициализации переменных:
intx; //инструкция объявления
х=100; //инструкция присваивания
19

int у=х; // инструкция объявления и инициализации
−
Составные инструкции состоят из набора простых инструкций, помещённых в фигурные скобки { }.
{ int x; //инструкция объявления
х=100; // инструкция присваивания
int у= х; // инструкция объявления и инициализации
}
В приведённом примере все три инструкции являются элементами одной инструкции, которые рассматриваются в программе в соответствии с порядком их записи.
Пробелы, знаки табуляции и переход на новую строку в языке рассматриваются как разделители. Лишние разделители игнорируются.
Пример:
myValue=100; или myValue = 100;
Эти инструкции компилятор обработает как абсолютн
В пределах строки пробелы не игнорируются.
Пример:
Console.WriteLine ("Я изучаю язык программирования");
Пробел между
будет обрабатываться как отдельный си
Пробелы применяют для лу
словами «Я», «изучаю», «язык», «программирования»
мвол строки.
чшей наглядности программы. Компилято-
ра разделители игнорируют.
1.8. ПРИМЕР РЕШЕНИЯ ЗАДАЧ
о идентичные.
Вычислить скорость летательного аппарата по формуле
abc
2000
HH
⎞
ц
,
⎟
⎠
где V = 300; H
1
= 2290; Нц = 1567.
абс
⎛
VV
−=
1
⎜
⎝
Вывести на печать исходные данные и результат решения.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
