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