Страница 20 из 188
Операция импликации может быть построена на основе комбинации логическихоператоров ! и |, как в приведенной ниже строке кода.!р | q
В следующем примере программы демонстрируется подобная реализация операции импликации.// Построение операции импликации в С#.using System;class Implication { static void Main() { bool p=false, q=false; int i, j; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { if(i==0) p = true; if(i==1) p = false; if(j==0) q = true; if(j==1) q = false; Console.WriteLine("p равно " + p + ", q равно " + q); if(!p | q) Console.WriteLine("Результат импликации " + p + " и " + q + " равен " + true); Console.WriteLine(); } } }}
Результат выполнения этой программы выглядит так.р равно True, q равно TrueРезультат импликации True и True равен Trueр равно True, q равно Falseр равно False, q равно FalseРезультат импликации False и True равен Trueр равно False, q равно FalseРезультат импликации False и False равен TrueУкороченные логические операторы
В 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("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
В приведенном выше фрагменте кода одно и то же значение 100 задается для переменных х, у и z с помощью единственного оператора присваивания. Это значениеприсваивается сначала переменной z, затем переменной у и, наконец, переменной х.Такой способ присваивания "по цепочке" удобен для задания общего значения целойгруппе переменных.Составные операторы присваивания
В C# предусмотрены специальные составные операторы присваивания, упрощающие программирование некоторых операций присваивания. Обратимся сначала кпростому примеру. Приведенный ниже оператор присваиваниях = х + 10;
можно переписать, используя следующий составной оператор присваивания.х += 10;
Пара операторов += указывает компилятору на то, что переменной х должно бытьприсвоено ее первоначальное значение, увеличенное на 10.
Рассмотрим еще один пример. Операторх = х - 100;
и операторx -= 100;
выполняют одни и те же действия. Оба оператора присваивают переменной х ее первоначальное значение, уменьшенное на 100.
Для многих двоичных операций, т.е. операций, требующих наличия двух операндов, существуют отдельные составные операторы присваивания. Общая форма всехэтих операторов имеет следующий вид;имя_переменной ор = выражение
где ор — арифметический или логический оператор, применяемый вместе с оператором присваивания.