Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Укороченные логические операторы C# Полное руководство Герберт Шилдт

Укороченные логические операторы C# Полное руководство Герберт Шилдт

В C# предусмотрены также специальные, укороченные варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций. Если первый операнд логической операции И имеет ложное значение (false), то ее результат будет иметь ложное значение независимо от значения второго операнда. Если же первый операнд логической операции ИЛИ имеет истинное значение (true), то ее результат будет иметь истинное значение независимо от значения второго операнда. Благодаря тому что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.
Укороченная логическая операция И выполняется с помощью оператора &&, а укороченная логическая операция ИЛИ — с помощью оператора I |. Этим укороченным логическим операторам соответствуют нормальные логические операторы & и |. Единственное отличие укороченного логического оператора от нормального заключается в том, что второй его операнд вычисляется только по мере необходимости.
В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной d на значение переменной п нацело. Если остаток от деления n/d равен нулю, то п делится на d нацело. Но поскольку данная операция подразумевает деление, то для проверки условия деления на нуль служит укороченный логический оператор И.

// Продемонстрировать применение укороченных // логических операторов.
using System;
class SCops { static void Main() { int n, d;
n = 10; d = 2;
if (d != 0 && (n % d) == 0)
Console .WriteLine (n + 11 делится нацело на 11 + d) ;
d = 0; // задать нулевое значение переменной d
// d равно нулю, поэтому второй операнд не вычисляется.
if (d ! = 0 && (n % d) == 0)
Console .WriteLine (n + 11 делится нацело на 11 + d) ;
// Если теперь попробовать сделать то же самое // без укороченного логического оператора, то // возникнет ошибка из-за деления на нуль, if (d != 0 & (n % d) == 0)
Console .WriteLine (n + 11 делится нацело на 11 + 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("Не выводится");
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, следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в С#.
И последнее замечание: укороченный оператор И называется также услоеным логическим оператором Я, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ.Прежде всего обратим внимание на то, что переменная someCondition типа bool инициализируется значением false. Далее проанализируем каждый оператор if. Как следует из комментариев к данной программе, в первом операторе if переменная i инкрементируется, несмотря на то, что значение переменной someCondition равно false. Когда применяется логический оператор &, как это имеет место в первом операторе if, выражение в правой части этого оператора вычисляется независимо от значения выражения в его левой части. А во втором операторе if применяется укороченный логический оператор. В этом случае значение переменной i не инкрементируется, поскольку левый операнд (переменная someCondition) имеет значение false, следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в С#.
И последнее замечание: укороченный оператор И называется также услоеным логическим оператором Я, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ.