Материал предоставлен http://it.rfet.ru

Укороченные логические операторы

В C# предусмотрены также специальные, укороченные, варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций.

Если первый операнд логической операции И имеет ложное значение (false), то ее результат будет иметь ложное значение независимо от значения второго операнда.

Если же первый операнд логической операции ИЛИ имеет истинное значение (true), то ее результат будет иметь истинное значение независимо от значения второго операнда.

Благодаря тому, что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.

Укороченная логическая операция И выполняется с помощью оператора &&, а укороченная логическая операция ИЛИ — с помощью оператора | |. Этим укороченным логическим операторам соответствуют обычные логические операторы & и |. Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости.

В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной 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("Не выводится");
    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, следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в C#.

И последнее замечание: укороченный оператор И называется также условным логическим оператором И, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ.

Операторы отношения и логические операторыОператор присваивания