Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования на языке C#. Учебное пособие
.pdf
33
4. ОПЕРАТОРЫ ЯЗЫКА C#
4.1. Оператор присваивания
Как в языке С++, так и в C# присваивание формально
считается операцией. Вместе с тем запись:
X= expr;
следует считать настоящим оператором присваивания, так же, как
и одновременное присваивание со списком переменных в левой
части:
X1 = X2 = ... = Xk = expr.
В отличие от языка C++ появление присваивания в
выражениях C# хотя и допустимо, но практически не встречается.
Например, запись:
if(x = expr),
часто используемая в С++, в языке C# в большинстве случаев будет
воспринята как ошибка еще на этапе компиляции.
4.2. Блок или составной оператор
С помощью фигурных скобок несколько операторов языка
(возможно, перемежаемых объявлениями) можно объединить в
единую синтаксическую конструкцию, называемую блоком или
составным оператором:
{
оператор_1
...
оператор_N
}
Синтаксически блок воспринимается как единичный
оператор и может использоваться всюду в конструкциях, где
синтаксис требует одного оператора. Тело цикла, ветви оператора
if, как правило, представляются блоком. Приведем пример, где тело
процедуры представлено блоком, в котором есть встроенные
блоки, задающие тело оператора цикла for и тела ветвей оператора
if:
31

34
/// демонстрация блоков (составных операторов)
public void Block()
{
int limit = 100;
int x = 120, y = 50;
int sum1 =0, sum2=0;
for (int i = 0; i< 11; i++)
{
int step = Math.Abs(limit -x)/10;
if (x > limit)
{x -= step; y += step;}
else
{x += step; y -= step;}
sum1 += x; sum2 +=y;
}
//limit = step; //переменная step перестала существовать
//limit = i; // переменная i перестала существовать
Console.WriteLine("x= {0}, y= {1}, sum1 ={2}, sum2 = {3}",
x,y,sum1,sum2);
}
Здесь в тело основного блока вложен блок, задающий тело
цикла, в котором объявлены две локальные переменные – i и step. В
свою очередь, в тело цикла вложены блоки, связанные с ветвями
then и else оператора if. Закомментированные операторы, стоящие
сразу за окончанием цикла, напоминают, что соответствующие
локальные переменные, определенные в блоке, перестают
существовать по его завершении.
4.3. Пустой оператор
Пустой оператор – это «пусто», завершаемое точкой с запятой.
Иногда полезно рассматривать отсутствие операторов как
существующий пустой оператор. Синтаксически допустимо ставить
лишние точки с запятой, полагая, что вставляются пустые
операторы. Например, синтаксически допустима следующая
конструкция:
for (int j=1; j<5; j++)
{;;;};
Она может рассматриваться как задержка по времени, работа
на холостом ходе.
32

35
4.4. Операторы выбора
Как в С++ и других языках программирования, в языке C#
для выбора одной из нескольких возможностей используются две
конструкции – if и switch. Первую из них обычно называют
альтернативным выбором, вторую – разбором случаев.
Оператор if
Начнем с синтаксиса оператора if:
if(выражение_1) оператор_1
else if(выражение_2) оператор_2
...
else if(выражение_K) оператор_K
else оператор_N
Какие особенности синтаксиса следует отметить? Выражения
if должны заключаться в круглые скобки и быть булевого типа.
Точнее, выражения должны давать значения true или false.
Напомню, арифметический тип не имеет явных или неявных
преобразований к булевому типу. По правилам синтаксиса языка
С++, then-ветвь оператора следует сразу за круглой скобкой без
ключевого слова then, типичного для большинства языков
программирования. Каждый из операторов может быть блоком – в
частности, if-оператором. Поэтому возможна и такая конструкция:
if(выражение1) if(выражение2) if(выражение3) ...
Ветви else и if, позволяющие организовать выбор из многих
возможностей, могут отсутствовать. Может быть опущена и
заключительная else-ветвь. В этом случае краткая форма оператора
if задает альтернативный выбор – делать или не делать – выполнять
или не выполнять then-оператор.
Семантика оператора if проста и понятна. Выражения if
проверяются в порядке их написания. Как только получено
значение true, проверка прекращается и выполняется оператор (это
может быть блок), который следует за выражением, получившим
значение true. С завершением этого оператора завершается и
оператор if. Ветвь else, если она есть, относится к ближайшему
открытому if.
33

36
Оператор switch
Частным, но важным случаем выбора из нескольких
вариантов является ситуация, при которой выбор варианта
определяется значениями некоторого выражения.
Соответствующий оператор C#, унаследованный от C++, но с
небольшими изменениями в синтаксисе, называется оператором
switch. Синтаксис:
switch(выражение)
{
case константное_выражение_1: [операторы_1
оператор_перехода_1] ...
case константное_выражение_K: [операторы_K
оператор_перехода_K]
[default: операторы_N оператор_перехода_N]
}
Ветвь default может отсутствовать. По синтаксису
допустимо, чтобы после двоеточия следовала пустая
последовательность операторов, а не последовательность,
заканчивающаяся оператором перехода. Константные выражения в
case должны иметь тот же тип, что и switch-выражение.
Приведем несколько примеров использования оператора
switch:
public void SetStatus()
{
switch (period)
{
case 1:
status = "child";
break;
case 2:
status = "schoolboy";
break;
case 3:
status = "student";
break;
case 4:
status = "junior researcher";
break;
34

37
case 5:
status = "senior researcher";
break;
case 6:
status = "professor";
break;
default :
status = "не определен";
break;
}
Console.WriteLine("Имя = {0}, Возраст = {1}, Статус = {2}",
name, age, status);
}//SetStatus
Этот пример демонстрирует корректный стиль
использования оператора switch. В следующем примере показана
роль пустых последовательностей операторов case-ветвей для
организации списка выражений одного варианта:
// Разбор случаев с использованием списков выражений
// "arg1" первый аргумент бинарной операции
// "arg2" второй аргумент бинарной операции
// "result" результат бинарной операции
public void ExprResult(string operation,int arg1, int arg2,
ref int result)
{
switch (operation)
{
case "+":
case "Plus":
case "Плюс":
result = arg1 + arg2;
break;
case "-":
case "Minus":
case "Минус":
result = arg1 - arg2;
break;
case "*":
35

38
case "Mult":
case "Умножить":
result = arg1 * arg2;
break;
case "/":
case "Divide":
case "Div":
case "разделить":
case "Делить":
result = arg1 / arg2;
break;
default:
result = 0;
Console.WriteLine("Операция не определена");
break;
}
Console.WriteLine ("{0} ({1}, {2}) = {3}",
operation, arg1, arg2, result);
}//ExprResult
4.5. Операторы перехода
Операторов перехода, позволяющих прервать естественный
порядок выполнения операторов блока, в языке C# несколько.
Оператор goto
Оператор goto имеет простой синтаксис и семантику:
goto [метка|case константное_выражение|default];
Все операторы языка C# могут иметь метку – уникальный
идентификатор, предшествующий оператору и отделенный от него
символом двоеточия. Передача управления помеченному
оператору – это классическое использование оператора goto. Два
других способа использования goto (передача управления в case
или default-ветвь) используются в операторе switch.
Операторы break и continue
В структурном программировании признаются полезными
«переходы вперед» (но не назад), позволяющие при выполнении
некоторого условия выйти из цикла, из оператора выбора, из блока.
Для этой цели можно использовать оператор goto, но лучше
36

39
применять специально предназначенные для этих целей операторы
break и continue.
Оператор break может стоять в теле цикла или завершать caseветвь в операторе switch. Пример его использования в операторе
switch уже демонстрировался. При выполнении оператора break в теле
цикла завершается выполнение самого внутреннего цикла. В теле
цикла, чаще всего, оператор break помещается в одну из ветвей
оператора if, проверяющего условие преждевременного завершения
цикла:
public void Jumps()
{
int i = 1, j=1;
for(i =1; i<100; i++)
{
for(j = 1; j<10;j++)
{
if (j>=3) break;
}
Console.WriteLine("Выход из цикла j при j = {0}", j);
if (i>=3) break;
}
Console.WriteLine("Выход из цикла i при i= {0}", i);
}//Jumps
Оператор continue используется только в теле цикла. В
отличие от оператора break, завершающего внутренний цикл,
continue осуществляет переход к следующей итерации этого цикла.
Оператор return
Еще одним оператором, относящимся к группе операторов
перехода, является оператор return, позволяющий завершить
выполнение процедуры или функции. Его синтаксис:
return [выражение];
Для функций его присутствие и аргумент обязательны,
поскольку выражение в операторе return задает значение,
возвращаемое функцией.
37

40
4.6. Операторы цикла
Оператор for
Наследованный от С++ весьма удобный оператор цикла for
обобщает известную конструкцию цикла типа арифметической
прогрессии. Его синтаксис:
for(инициализаторы; условие; список_выражений) оператор
Оператор, стоящий после закрывающей скобки, задает тело
цикла. В большинстве случаев телом цикла является блок. Сколько
раз будет выполняться тело цикла, зависит от трех управляющих
элементов, заданных в скобках. Инициализаторы задают начальное
значение одной или нескольких переменных, часто называемых
счетчиками или просто переменными цикла. В большинстве
случаев цикл for имеет один счетчик, но часто полезно иметь
несколько счетчиков, что и будет продемонстрировано в
следующем примере. Условие задает условие окончания цикла,
соответствующее выражение при вычислении должно получать
значение true или false. Список выражений, записанный через
запятую, показывает, как меняются счетчики цикла на каждом шаге
выполнения. Если условие цикла истинно, то выполняется тело
цикла, затем изменяются значения счетчиков и снова проверяется
условие. Как только условие становится ложным, цикл завершает
свою работу.
В цикле for тело цикла может ни разу не выполняться, если
условие цикла ложно после инициализации, а может происходить
зацикливание, если условие всегда остается истинным. В
нормальной ситуации тело цикла выполняется конечное число раз.
Счетчики цикла зачастую объявляются непосредственно в
инициализаторе и соответственно являются переменными,
локализованными в цикле, так что после завершения цикла они
перестают существовать. В тех случаях, когда предусматривается
возможность преждевременного завершения цикла с помощью
одного из операторов перехода, счетчики объявляются до цикла,
что позволяет анализировать их значения при выходе из цикла.
В качестве примера рассмотрим классическую задачу: является
ли строка текста палиндромом. Напомним, палиндромом называется
симметричная строка текста, читающаяся одинаково слева направо и
справа налево. Для ее решения цикл for подходит наилучшим
38

41
образом: здесь используются два счетчика – один возрастающий,
другой убывающий. Вот текст соответствующей процедуры:
// Определение палиндромов.Демонстрация цикла for
//"str" текст
//true - если текст является палиндромом
public bool Palindrom(string str)
{
for (int i =0,j =str.Length-1; i<j; i++,j--)
if(str[i]!=str[j]) return(false);
return(true);
}//Palindrom
Циклы While
Цикл while (выражение) является универсальным видом
цикла, включаемым во все языки программирования. Тело цикла
выполняется до тех пор, пока остается истинным выражение while.
В языке C# у этого вида цикла две модификации – с проверкой
условия в начале и в конце цикла. Первая модификация имеет
следующий синтаксис:
while(выражение) оператор
Эта модификация соответствует стратегии: «сначала проверь,
а потом делай». В результате проверки может оказаться, что и
делать ничего не нужно. Тело такого цикла может ни разу не
выполняться. Конечно же, возможно и зацикливание. В
нормальной ситуации каждое выполнение тела цикла - это
очередной шаг к завершению цикла.
Цикл, проверяющий условие завершения в конце,
соответствует стратегии: «сначала делай, а потом проверь». Тело
такого цикла выполняется, по меньшей мере, один раз. Вот
синтаксис этой модификации:
do
оператор
while(выражение);
Приведем пример, в котором участвуют обе модификации
цикла while. Во внешнем цикле проверка выполняется в конце, во
внутреннем – в начале. Внешний цикл представляет собой
типичный образец организации учебных программ, когда в диалоге
с пользователем многократно решается некоторая задача. На
39

42
каждом шаге пользователь вводит новые данные, решает задачу и
анализирует полученные данные. В его власти, продолжить
вычисления или нет, но хотя бы один раз решить задачу ему
приходится.
Внутренний цикл do while используется для решения уже
известной задачи с палиндромами. Вот текст соответствующей
процедуры:
// Два цикла: с проверкой в конце и в начале.
// Внешний цикл - образец многократно решаемой задачи.
// Завершение цикла определяется в диалоге
// с пользователем.
public void Loop()
{
string answer, text;
do
{
Console.WriteLine("Введите слово");
text = Console.ReadLine();
int i =0, j = text.Length-1;
while ((i<j) && (text[i] == text[j]))
{i++; j--;}
if (text[i] == text[j])
Console.WriteLine(text +" - это палиндром!");
else
Console.WriteLine(text +" - это не палиндром!");
Console.WriteLine("Продолжим? (yes/no)");
answer = Console.ReadLine();
}
while(answer =="yes");
}//Loop
Цикл foreach
Новым видом цикла, не унаследованным от С++, является
цикл foreach, удобный при работе с массивами, коллекциями и
другими подобными контейнерами данных. Его синтаксис:
foreach(тип идентификатор in контейнер) оператор
Цикл работает в полном соответствии со своим названием –
тело цикла выполняется для каждого элемента в контейнере. Тип
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
