Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

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

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

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

Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектов. Пример:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class Program

{

static void Main()

{

short d = 12, f = 1, i = 0;

bool b = true;

// В данном случае используется укороченный оператор

// и операция сравнения выполнится в нормальном потоке

if (f != 0 && (d % f) == 0)

Console.WriteLine("{0} делится нацело на {1}", d, f);

// В этом случае так же используется укороченный оператор,

// но при этом возникнет исключительная ситуация

// т.к. первый оператор сравнения содержит деление на 0

if ((d % f) == 0 && f != 0)

Console.WriteLine("{0} делится нацело на {1}", d, f);

// При использовании целостного оператора в любом

// случае возникнет исключительная ситуация

if (f != 0 & (d % f) == 0)

Console.WriteLine("{0} делится нацело на {1}", d, f);

// Практический пример использования обычных операторов.

// При использовании обычного оператора, в данной конструкции

// i будет инкреминироваться

if (b | (++i < 10))

Console.WriteLine("i равно {0}", i); // i = 1

i = 0;

// При использовании укороченного оператора

// значение i останется прежним

if (b || (++i <= 10))

Console.WriteLine("i равно {0}", i); // i = 0

Console.WriteLine("Для продолжение нажмите любую клавишу . . . ");

Console.ReadLine();

}

}

}

/* Выведет:

* 12 делится нацело на 1

* 12 делится нацело на 1

* 12 делится нацело на 1

* i равно 1

* i равно 0

* Для продолжение нажмите любую клавишу . . .

*/

Если в коде примера выше переменной f задать число «0, будет выдано исключение «деления на ноль»: DivideByZeroException.