Вторник, 23.04.2024, 23:41
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Оператор goto
00:01
Оператор goto
Оператор goto
С# позволяет помечать строки кода, а затем непосредственно переходить к их
выполнению с помощью оператора goto. У этого оператора имеются свои преиму-
щества и недостатки. Основное преимущество заключается в том, что это очень
простой способ управлять очередностью выполнения кодов. Однако чрезмерное
его использование может привести к трудному для понимания "лоскутному" коду,
что является его главным недостатком.
Для лучшего понимания давайте рассмотрим, каким образом может использо-
ваться этот оператор.
Оператор goto имеет вид:
goto <имяМетки>;
Метки задаются таким образом:
<имяМетки>:
В качестве примера разберем следующий код:
int my Integer = 5;
goto myLabel;
myInteger +=10;
myLabel:
Console.WriteLine("mylnteger = {0}•, myinteger);
Его выполнение осуществляется следующим образом:
• Переменная myinteger объявляется как имеющая тип int
и ей присваивается значение 5.
G Оператор goto прерывает нормальный ход выполнения кода
и передает управление на строку с меткой myLabel:.
• Значение переменной myinteger выводится на консоль.
Строка кода, выделенная в приведенной ниже программе серым цветом, ни-
когда не будет выполняться:
int myinteger = 5;
goto myLabel;
myinteger += 10;
myLabel:
Console.WriteLine('myinteger = {0}", myinteger);
В самом деле, если вы попытаетесь использовать этот код в приложении, то обнару-
жите, что при попытке его откомпилировать появится предупреждение "Unreachable
code detected" ("Обнаружен невыполняемый код") с номером соответствующей
строки.
Операторы goto используются на практике,
но они могут приводить к очень большой путанице.
В качестве примера "лоскутного" кода, получающегося при использовании опе-
ратора goto, рассмотрим следующую программу:
start;
int myinteger = 5;
goto addVal;
writeResult;
Console.WriteLine("myinteger = {0}*, myinteger);
Управление порядком выполнения 57
goto start;
: • • . . • - . . . • • : : • :
• goto writeResult; : .-'.
Это вполне допустимый код, но как трудно в нем разобраться! Вы можете само-
стоятельно попрактиковаться и попытаться понять, что здесь происходит. Однако
прежде чем приступить к этому, попробуйте понять смысл данного кода, просто
взглянув на него. Вы заслуживаете похвалы, если вам удалось это сделать.
Мы еще вернемся к этому оператору, поскольку он предназначен для совмест-
ного использования с некоторыми другими конструкциями, рассматриваемыми
в настоящей главе (хотя, по правде говоря, автор не является сторонником его ис-
пользования).
Ветвление
Ветвление — это способ управлять тем, какая строка кода должна выполняться
следующей. Строка, на которую следует передать управление, определяется с по-
мощью некоторого условного оператора. Работа такого условного оператора осно-
вана на выполнении сравнения контрольного значения и одного или нескольких
возможных значений с использованием булевой логики.
В этом разделе мы рассмотрим три способа ветвления, имеющихся в С#:
• Тринарный оператор
• Оператор if
• Оператор switch
Тринарный оператор
Наиболее простой способ выполнения проверки — использование тринарного
(или условного) оператора, упоминавшегося в предыдущей главе. Вы уже позна-
комились с унарными операторами, которые выполняются над одним операндом,
и бинарными операторами, которые выполняются над двумя операндами, поэтому
у вас вряд ли вызовет удивление тот факт, что данный оператор выполняется над
тремя операндами. Синтаксис тринарного оператора имеет следующий вид:
;>::;: : ; <проверка> ? <результатЕслиИстина> : <результатЕслиЛожь>
В данном случае условие <проверка> вычисляется для получения логического
значения, и в зависимости от него результатом выполнения этого оператора будет
<результатЕслиИстина> ИЛИ <результатЕслиЛожь>.
Мы можем использовать этот оператор следующим образом:
string resultString = (mylnteger < 10) ? "Меньше 10"
: "Больше или равно 10";
Результатом выполнения тринарного оператора будет одна из двух строк, каж-
дая из которых может быть присвоена переменной resultString. Выбор того, ка-
кую именно из этих двух строк следует присвоить, производится путем сравнения
значения переменной my integer с 10, причем если значение переменной меньше 10,
присваивается первая строка, а если больше или равно 10 — вторая. Например,
в том случае, если значение переменной mylnteger равняется 4, переменной
resultString будет присвоена строка 'Меньше 10".
Глава 4
Описанный оператор вполне подходит для выполнения простых присваиваний,
как в приведенном примере, однако для выполнения больших объемов кода он не
приспособлен. Здесь лучше использовать оператор if.
Оператор if
Оператор if является гораздо более гибким способом принятия решений. В от-
личие от операторов ?:, операторы if не имеют результата (поэтому их нельзя ис-
пользовать в операторах присваивания), зато появляется возможность применять
их для выполнения каких-либо других операторов при соблюдении определенного
условия.
Наипростейшей формой оператора if является следующая:
if (<условие>)
<код, который выполняется, если вычисление <условия> дает результат true>;
Когда происходит вычисление <условия> (а в результате этих вычислений должно
получаться логическое значение, иначе код не пройдет компиляцию), строка кода,
расположенная под оператором, будет выполнятся только в случае значения true.
После того как эта строка кода будет выполнена, а также если эта строка не будет
выполняться (из-за того, что получено значение false), работа продолжится со
следующей за условным оператором строки кода.
Можно задать дополнительный код, воспользовавшись оператором else в соче-
тании с оператором if. Этот оператор будет выполняться только в том случае,
если в результате вычисления <условия> будет получено значение false:
if {<условие>)
<код, который выполняется, если вычисление <условия> дает результат true>;
else
<код, который выполняется, если вычисление <условия> дает результат £alse>;
Каждый раздел кода может занимать несколько строк, для чего используются
фигурные скобки:
i f (<условие>)
Ш;Ш£ - ,
<код, который выполняется, если вычисление <условия> дает результат true>;
)
else
<код, который выполняется, если вычисление <условия> дает результат false>;
В качестве простого примера перепишем код из предыдущего раздела, в кото-
ром использовался тринарный оператор, с помощью оператора if:
string resultString = (mylnteger < 10) ? "Меньше 10" : "Больше или равно 10";
Поскольку результат выполнения оператора if нельзя присваивать перемен-
ным, то потребуется отдельный шаг:
string resultString;
if (mylnteger < 10)
resultString - "Меньше 10";
resultString - "Болые или равно 10м;
Управление порядком выполнения 59
Такой код, хотя он и многословнее, гораздо проще читать и понимать, чем тот,
в котором использовался тринарныи оператор; к тому же такой код оказывается
более гибким.
Давайте обратимся к примеру.
Практикум: использование оператора if
1. Создайте новое консольное приложение с именем chO4ExO2
В Директории C:\BegCSharp\Chapter4.
2. Добавьте следующий код в ciassi.cs:
static void Main (string [] args)
string comparison;
Console.WriteLine('Enter a number:*);
double varl = Convert.ToDouble(Console.ReadLineO);
Console.WriteLine('Enter another number:*);
double var2 = Convert.ToDouble(Consоle.ReadLineO);
if (varl < var2)
comparison = 'less than*;
else .
if (varl — var2)
comparison - 'equal to*;
else .
comparison = "greater than";
Console.WriteLineCThe first number is {0} the second number.*, comparison);
—.
;
••
i .
L
C:\Be<|C«
9
tap an
0 e
firs
1ZJZ
other
t fu«r>h
у къу
:zi
rutf
to
- -
be v -
is less i
continue
—;-"*•
Лшп the
z
-- h
I
3. Запустите код и введите
два числа в ответ
на приглашения
(см. рис. справа).
Как это работает
Первая часть кода вам уже знакома: здесь происходит получение двух значений
типа double из строк, введенных пользователем:
string comparison;
Console.WriteLine("Enter a number:*);
double varl = Convert.ToDouble(Console.ReadLine());
Console.WriteLine('Enter another number:*);
double var2 = Convert.ToDouble(Console.ReadLine());
Далее переменной comparison типа string, в зависимости от значений, полу-
ченных для varl и var2, присваивается строка:
if (varl < var2)
comparison = 'less than*;
Если данное условие не выполняется, то это значит, что varl либо больше,
либо равно var2. Тогда в разделе else первого сравнения делается еще одно, вло-
женное сравнение:
else
{
if (varl == var2)
comparison = 'equal to*;
60 Глава 4
Раздел else второго сравнения будет достигнут только в том случае, если vari
больше, чем var2:
else
comparison = "greater than*;
}
В заключение происходит вывод значения переменной comparison на консоль:
Console.WriteLineCThe first number is {0} the second number.", comparison);
Использование вложенных операторов представляет собой лишь один из воз-
можных путей решения этой задачи. С тем же успехом мы могли бы написать сле-
дующее:
if (varl < var2) •/. '
comparison = 'less than";
if {varl == var2) ; . .:; /••
comparison = "equal to";
if {varl > var2)
comparison = "greater than";
Недостатком такого способа является необходимость выполнять все три срав-
нения независимо от значений переменных varl и var2. В первом же случае вы-
полняется только одно сравнение, если varl < var2 есть true, и два сравнения
в противном случае (мы также выполняем сравнение varl •• var2), т. е. выполня-
ется меньшее число строк кода. Разница в быстродействии несущественна, однако
она может иметь значение для тех приложений, для которых скорость выполнения
является критичной.
Проверка большего количества условий
с помощью оператора if
В предыдущем примере мы проверяли три условия для значения переменной
varl, которые охватывали все возможные для нее значения. Однако в некоторых
случаях может потребоваться выполнять проверку на какие-то конкретные значе-
ния, например, 1, 2, 3, 4 и т. д. Используя тот же подход, мы получим неудобова-
римый вложенный код вроде:
if (varl == 1)
{
//выполнение каких-либо действий •
:: • •''' : : '' .' • • : ' .; } ^ :•;'•::;: ••;•;••;•:••••' : './•.'" •: ; i / л •: г' ". V , " ' Ш ^ : \ - \ . - ^ ' г . Х ' - - > ^ - ' ^ '• •:••:.;:-;:- :• ;::-': >:;;
• • : - . . . . e l s e ' '•• V ''•'•. • : >:
if {varl == 2)
// выполнение каких-либо других действий , ;
1 ^ v . '; ;.. -: •:;::.
•'...; '••.. else
^ ;;" ' " " " " " " : " "":'•'. \ 1 . ' , \ . , : - - \ - . ^ Ш ^ : : У • : : : л ' ; ; : ; ; : : > 7 : ; т ^ ; ; ' . ' .•.;.;•,•.•:•..;•/•••':' •'••''"-У-." ;.
if {varl = = 3 N varl == 4)
// выполнение каких-либо других действий
: ;,;:;•:•; : : ; i ; : : : r ; : , , ' :•;•;;, • • )
else
{
// выполнение каких-либо других действий
Управление порядком выполнения 61
Существует очень распространенная ошибка, когда условие
в третьем сравнении записывается как if (vari == з \\ 4).
В таком случае в полном соответствии со старшинством
операторов сначала будет выполнен оператор ==,
в результате чего оператор \\ будет выполняться
с операндами логического и численного типов.
Это приведет к ошибке.
В такой ситуации разумнее применить несколько иную систему отступов и объ-
единения элементов кода дая блоков else (т. е. использовать после блока else
одну строку кода, а не целый блок кода). Если мы поступим таким образом, то по-
лучим следующую структуру, содержащую операторы else if:
} ^ ^, "^ . '" •- ; .'
e l s e if (varl = = 2 )
i:;";:";•:.'":::-":;:-:::-:• -^::"-^:'.;:;• -'i"'•::'-'";;/:::•.: :гМ:"Щ:-У'У:[ •' '• ' '^у.УуСФ-Ф'^' -': —••:'-' У
// выполнение каких-либо д р у г и х д е й с т в и й
} . ; '•
else if (varl ===== 3 1 I varl == 4)
{ . ' • . • . • . ' . . ' • • . ; • . • • : . .: . ' . '
else
{
// выполнение каких-либо других действий . ;.
}
На самом деле операторы else if представляют собой два отдельных операто-
ра, и вышеприведенный код идентичен первоначальному варианту. Однако такой
код является более удобочитаемым.
Когда необходимо выполнять такое большое количество сравнений, как в этом
примере, стоит рассмотреть альтернативную возможность организации ветвления
















Категория: информатика | Просмотров: 1795 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz