В приведенном ниже примере программы демонстрируется применение укорочен ного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной d на значение пе ременной n нацело. Если остаток от деления n/d равен нулю, то n делится на d нацело. Но поскольку данная операция подразумевает деление, то для проверки условия деле ния на нуль служит укороченный логический оператор И. // Продемонстрировать применение укороченных логических операторов. using System; class SCops { static void Main { int n, d; n = 10; d = 2; if (d ! = 0 && (n % d) == 0) Console.WriteLine(n + " делится нацело на " + d); d = 0; // задать нулевое значение переменной d // d равно нулю, поэтому второй операнд не вычисляется if (d != 0 && (n % d) == 0) Console.WriteLine(n + " делится нацело на " + d); // Если теперь попытаться сделать то же самое без укороченного // логического оператора, то возникнет ошибка из-за деления на нуль. if (d != 0 & (n % d) == 0) Console.WriteLine(n + " делится нацело на " + d); } }
Для исключения ошибки из-за деления на нуль в операторе if сначала проверяет ся условие: равно ли нулю значение переменной d. Если оно равно нулю, то на этом выполнение укороченного логического оператора И завершается, а последующая опе рация деления по модулю не выполняется. Так, при первой проверке значение пере менной d оказывается равным 2, поэтому выполняется операция деления по модулю. А при второй проверке это значение оказывается равным нулю, следовательно, опера ция деления по модулю пропускается, чтобы исключить деление на нуль. И наконец, выполняется обычный логический оператор И, когда вычисляются оба операнда. Если при этом происходит деление на нуль, то возникает ошибка при выполнении.
Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логи ческой операции И либо ИЛИ из-за возникающих побочных эффектов. Рассмотрим следующий пример программы. // Продемонстрировать значение побочных эффектов. using System; class SideEffects { static void Main { int i; bool someCondition = false; i = 0; // Значение переменной i инкрементируется, // несмотря на то, что оператор if не выполняется. if(someCondition & (++i < 100)) Console.WriteLine("He выводится"); Console.WriteLine("Оператор if выполняется: " + i); // выводится 1 // В данном случае значение переменной i не инкрементируется, // поскольку инкремент в укороченном логическом операторе опускается. if(someCondition && (++i < 100)) Console.WriteLine("He выводится"); Console.WriteLine("Оператор if выполняется: " + i); // по-прежнему 1 !! } }
Прежде всего обратим внимание на то, что переменная someCondition типа bool инициализируется значением false. Далее проанализируем каждый оператор if. Как следует из комментариев к данной программе, в первом операторе if перемен ная i инкрементируется, несмотря на то что значение переменной someCondition равно false. Когда применяется логический оператор &, как это имеет место в первом операторе if, выражение в правой части этого оператора вычисляется независимо от значения выражения в его левой части. А во втором операторе if применяется укоро ченный логический оператор. В этом случае значение переменной i не инкрементиру ется, поскольку левый операнд (переменная someCondition) имеет значение false, следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логи ческих операций, доступных в С#.
И последнее замечание: укороченный оператор И называется также условным логи ческим оператором И, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ. Оператор присваивания
Оператор присваивания обозначается одиночным знаком равенства (=). В С# опера тор присваивания действует таким же образом, как и в других языках программирова ния. Ниже приведена его общая форма. имя_переменной = выражение
Здесь имя_переменной должно быть совместимо с типом выражения.
У оператора присваивания имеется одна интересная особенность, о которой вам будет полезно знать: он позволяет создавать цепочку операций присваивания. Рассмо трим, например, следующий фрагмент кода. int х, у, z; х = у = z = 100; // присвоить значение 100 переменным х, у и z