|
Главная » 2010 » Февраль » 11 » Оператор 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 |
|
Статистика
Онлайн всего: 1 Гостей: 1 Пользователей: 0
|