Таблица 2.21 – Старшинство операторов
Старшинство | Операторы |
Высшее | ++, - - (используемые в качестве префиксов), (), + , - (унарные), !, ~ *, /, % +, -, <<, >> <, >, <=, >=, = =, !=, &, ^, |, &&, ||, =, *=, /=, %=, +=, - =, << =, >>=, &=, ^=, | = |
Низшее | ++,--(используемые в качестве суффиксов) |
Теперь она точно определяет, каким образом следует вычислять выражения, например:
varl = var2 <= 4 && var2 >= 2;
в котором оператор && выполняется после операторов <= и >=.
Здесь необходимо отметить тот факт, что совершенно не возбраняется использовать скобки с целью сделать выражения более понятными. Компилятор в любом случае разберется, в каком порядке следует выполнять операторы, а вот людям свойственно забывать о таких вещах. Записав вышеприведенное выражение следующим образом:
varl = (var2 <= 4) && (var2 >= 2);
можно решить эту проблему, явно указав последовательность выполнения операций.
2.2.3.Оператор goto
С# позволяет помечать строки кода, а затем непосредственно переходить к их выполнению с помощью оператора goto. У этого оператора имеются свои преимущества и недостатки Основное преимущество заключается в том, что это очень простой способ управлять очередностью выполнения кодов. Однако чрезмерное его использование может привести к трудному для понимания "лоскутному" коду, что является его главным недостатком.
Для лучшего понимания рассмотрим, каким образом может использоваться этот оператор. Оператор goto имеет вид:
goto <имяМетки>;
Метки задаются таким образом:
<имяМетки>:
В качестве примера разберем следующий код:
int myInteger = 5; | |||
goto myLabel; | |||
mylnteger += 10; | |||
myLabel: | |||
Console.WriteLine(“myInteger = {0}", myInteger); |
Его выполнение осуществляется следующим образом:
- переменная myInteger объявляется как имеющая тип int и ей присваивается значение 5;
- оператор goto прерывает нормальный ход выполнения кода и передает управление на строку с меткой myLabel:; - значение переменной myInteger выводится на консоль.
Строка кода, выделенная в приведенной выше примере программы курсивом, никогда не будет выполняться.
Если попытаться использовать этот код в приложении, то при попытке его откомпилировать появится предупреждение "Unreachable code detected" ("Обнаружен невыполняемый код") с номером соответствующей строки.
Операторы goto используются на практике, но они могут приводить к очень большой путанице.
В качестве примера "лоскутного" кода, получающегося при использовании оператора goto, рассмотрим следующую программу start:
int myInteger = 5; goto addVal;
writeResult: Console.WriteLine(“myInteger = {0}”, myInteger); goto start;addVal: myInteger +=10; goto writeResult;
Это вполне допустимый код, однако в нем чрезвычайно трудно разобраться.
Оператор goto предназначен для совместного использования с некоторыми другими конструкциями, рассматриваемыми в настоящей лекции.
2.3.Ветвление
Ветвление – это способ управлять тем, какая строка кода должна выполняться следующей. Строка, на которую следует передать управление, определяется с помощью некоторого условного оператора. Работа такого условного оператора основана на выполнении сравнения контрольного значения и одного или нескольких возможных значений с использованием булевой логики.
Существует три способа ветвления, имеющихся в С#:
- тринарный оператор; - оператор if; - оператор switch.
2.3.1.Тринарный оператор
Наиболее простой способ выполнения проверки – использование тринарного (или условного) оператора. Синтаксис тринарного оператора имеет следующий вид:
<проверка> ? <результатЕслиИстина> : <результатЕслиЛожь>
В данном случае условие <проверка> вычисляется для получения логического значения, и в зависимости от него результатом выполнения этого оператора будет <результатЕслиИстина> или <результатЕслиЛожь>. Можно использовать этот оператор, как показано на рис. 2.1.
string resultString = (myInteger < 10) ? “Меньше 10”: “Больше или равно 10”; | оператора |
Рис. 2.1 – Пример использования тринарного |
Результатом выполнения тринарного оператора будет одна из двух строк, каждая из которых может быть присвоена переменной resultString. Выбор того, какую именно из этих двух строк следует присвоить, производится путем сравнения значения переменной myInteger с 10, причем если значение переменной меньше 10, присваивается первая строка, а если больше или равно 10 – вторая. Например, в том случае, если значение переменной myInteger равняется 4, переменной resultString будет присвоена строка “Меньше 10”.
Описанный оператор вполне подходит для выполнения простых присваиваний, как в приведенном примере, однако для выполнения больших объемов кода он не приспособлен. Здесь лучше использовать оператор if.
2.3.2.Оператор if
Оператор if является гораздо более гибким способом принятия решений. В отличие от операторов ?:, операторы if не имеют результата (поэтому их нельзя использовать в операторах присваивания), зато появляется возможность применять их для выполнения каких-либо других операторов при соблюдении определенного условия. Простейшей формой оператора if является следующая:
if (<условие>)
<код, который выполняется, если вычисление <условия> дает результат true>;Когда происходит вычисление <условие> (а в результате этих вычислений должно получаться логическое значение, иначе код не пройдет компиляцию), строка кода, расположенная под оператором, будет выполнятся только в случае значения true. После того как эта строка кода будет выполнена, а также если эта строка не будет выполняться (из-за того, что получено значение false), работа продолжится со следующей за условным оператором строки кода.
Можно задать дополнительный код, воспользовавшись оператором else в сочетании с оператором if. Этот оператор будет выполняться только в том случае, если в результате вычисления <условия> будет получено значение false.
if (<условие>)
<код, который выполняется, если вычисление <условия> дает результат true>; else<код, который выполняется, если вычисление <условия> дает результат false>;
Каждый раздел кода может занимать несколько строк, для чего используются фигурные скобки:
if (<условие>)
{
<код, который выполняется, если вычисление <условия> дает результат true>;
}
else
{
<код, который выполняется, если вычисление <условия> дает результат false>;
}
В качестве простого примера перепишем код (рис.2), в котором использовался тринарный оператор, с помощью оператора if:
string resultString = (myInteger < 10) ? “Меньше 10” : “Больше или равно 10”;.
Поскольку результат выполнения оператора if нельзя присваивать переменным, то потребуется отдельный шаг string resultString; if (myInteger < 10) resultString = “Меньше 10”;else resultString = “Больше или равно 10”;
Такой код, хотя он и многословнее, гораздо проще читать и понимать, чем тот, в котором использовался тринарный оператор, к тому же такой код оказывается более гибким.
Давайте обратимся к примеру.
1. Создайте новое консольное приложение.
2. Добавьте следующий код в Class1.cs:
static void Main(string[] args) { string comparison;
Console.WriteLine("Enter a number:");
double varl = Convert.ToDouble(Console.ReadLine()) ; Console.WriteLine(“Enter another number:”) ; double var2 = Convert.ToDouble(Console.ReadLine()); if (varl < var2)comparison = "less than";
else { if (varl == var2) comparison = "equal to";
else comparison = "greater than";
}
Console.WriteLine("The first number is {0} the second number.”, comparison); }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";Раздел else второго сравнения будет достигнут только в том случае, если var1 больше, чем var2: