Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 21
Текст из файла (страница 21)
Операторы 99 ) (Ы а Ь2) — Ггце Ы ) Ь2 — ггце Ьа — ггце Логические операторы в С№ выполняют наиболее распространенные логические операции. Тем не менее существует ряд операций, выполняемых по правилам формальной логики. Эти логические операции могут быть построены с помощью логических операторов, поддерживаемых в С№. Следовательно, в С№ предусмотрен такой набор логических операторов, которого достаточно для построения практически любой логической операции, в том числе импликации. Имтиикат(ия — зто двоичная операция, результатом которой является ложное значение только в том случае, если левый ее операнд имеет истинное значение, а правый — ложное.
(Операция импликации отражает следующий принцип: истина не может подразумевать ложь.) Ниже приведена таблица истинности для операции импликации. Результат импликации р и с1 ггце ггце Га1ве Еа1яе ггце Га1яе Га1ве ггце ггце Га1ве ггце ггце Операция импликации может быть построена из сочетания логических операторов ! и ), как в приведенной ниже строке кода. 'р)ч В следующем примере программы демонстрируется подобная реализация операции импликации: // Построение операции импликации в СМ. цвьпч зуяеепц с1аяв 1зр11сасьоп ( всатьс уоьп Маьп() ( Ьоо1 р Га1ве, Ч=та1яет гпс 1, Сопяо1е.иг1геЬ1пе("р равно " т р т ", Ч равно " т Ч); 1Е(!р ) я) Сопяо1е.нг1тепьпе("Результат импликации " т р + " и " + Ч + " равен " + ггце)( Сопяо1е.нгьгет ьпе () т ) ) ) ) Еог(1 = 0; ).
Гог(1 = 0; 1г(1= 0) 1Г(1==1) 1Г(1==0) 1Е(1==1) < 2т 1тт) ( 2 < 2; Отт) ( р = ггце; р = Га1яет ч = ггце) Ч = Еа1вет 100 часть (. Язык С№ Результат выполнения этой программы выглядит так: р равно тгие, Ч равно Тгпе Результат импликации Тгпе и Тгце равен Тгпе р равно Тгце, Ч равно Га1ве р равно Га1ве, Ч равно Га1ве Результат импликации Га1ве и Тгце равен Тгце р равно Га1ве, ч равно Га1ве Результат импликации Га1ве и Га1ве равен Тгце Укороченные логические операторы В С№ предусмотрены также специальные, укороченные варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций.
Если первый операнд логической операции И имеет ложное значение 1га1ве), то ее результат будет иметь ложное значение независимо от значения второго операнда. Если же первый операнд логической операции ИЛИ имеет истинное значение гсгце), то ее результат будет иметь истинное значение независимо от значения второго операнда. Благодаря тому что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода Укороченная логическая операция И выполняется с помощью оператора аз, а укороченная логическая операция ИЛИ вЂ” с помощью оператора ( (. Этим укороченным логическим операторам соответствуют нормальные логические операторы а и (. Единственное отличие укороченного логического оператора от нормального заключается в том, что второй его операнд вычисляется только по мере необходимости.
В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной с) на значение переменной и нацело. Если остаток от деления и/с) равен нулю, то и делится на г( нацело.
Но поскольку данная операция подразумевает деление, то для проверки условия деления на нуль служит укороченный логический оператор И. // Продемонстрировать применение укороченных // логических операторов. цв1по зувсев) с1авв зсорв ( всасьс чо1П Маьл() ( глг и, П) и = 10) с(= 2) 11(с( != О аа (и % с() == О) Сопво1е.игьсесьпе(п + " делится нацело на " т П) ) П = 0) // задать нулевое значение переменной П // о равно нулю, поэтому второй операнд // не вычисляется. Глава 4.
Операторы 101 1Е(б != 0 ав (и Ъ б) == 0) Сопво1е.нгхпеЬЕпе(п т " делится нацело на " + б) // Если теперь попробовать сделать то же самое // без укороченного логического оператора, то // возникнет ошибка из-за деления на нуль. ЕЕ(б != 0 а (и % б) == 0) сопво1е.игьсеьхпе(п + " делится нацело на " + б) Для исключения ошибки из-за деления иа нуль в операторе ЕЕ сначала проверяется условие: равно ли нулю значение переменной б. Если оно равно нулю, то на этом выполнение укороченного логического оператора И завершается, а последующая операция деления по модулю не выполняется.
Так, при первой проверке значение переменной г) оказывается равным 2, поэтому выполняется операция деления по модулю. А при второй проверке это значение оказывается равным нулю, следовательно, операция деления по модулю пропускается, чтобы исключить деление на нуль. И наконец, выполняется нормальный логический оператор И, когда вычисляются оба операнда. Если при этом происходит деление на нуль, то возникает ошибка при выполнении.
Укороченные логические операторы иногда оказываются более эффективными, чем их нормальные аналоги. Так зачем же нужны нормальные логические операторы И и ИЛИ7 Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ ради получающихся побочных эффектов. Рассмотрим следующий пример программы: // Продемонстрировать значение побочных зффектов. цвхпд Зуасеш) с1авв 51беЕЕЕеств ( вгагьс чо1б Маьп() ( Епо 1; Ьоо1 вошеСопбьсьоп = Еа1вет 1 = 0 // Значение переменной 1 инкрементируется, // несмотря на то, что оператор ЕЕ не выполняется.
ЕЕ(вошеСопбьохоп в (++1 < 100)) Сопво1е.нгьтеЬЕпе("Не выводится"); Сопво1е.нгхгеввпе("Оператор ьЕ выполняется: " + 1) // выводится 1 // В данном случае значение переменной 1 не // инкрементируется, поскольку инкремент // в укороченном логическом операторе опускается. ЕЕ(вошесопб1сьоп аа (ь+1 < 100)) Сопво1е.нгьтеЬ1пе("Не выводится"); Сопво1е.Иг1ве11пе("Оператор ЕЕ выполняется: " + 1) // по-прежнему остается 1 )! ) 102 Часть 1 Язык С№ Прежде всего обратим внимание на то, что переменная зоиесопП101оп типа Ьоо1 инициализируется значением уа1зе. Далее проанализируем каждый оператор 11.
Как следует из комментариев к данной программе, в первом операторе 1й переменная 1 инкрементируется, несмотря на то, что значение переменной эокаесопо111оп равно уа1эе. Когда применяется логический оператор а, как зто имеет место в первом операторе 11, выражение в правой части этого оператора вычисляется независимо от значения выражения в его левой части. А во втором операторе 11 применяется укороченный логический оператор. В этом случае значение переменной 1 не инкрементируется, поскольку левый операнд (переменная зокаесопо111оп) имеет значение уа1зе, следовательно, выражение в правой части данного оператора пропускается.
Из этого следует вывод: если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в СФ. И последнее замечание: укороченный оператор И называется также условным ломгческим операторам И, а укороченный оператор ИЛИ вЂ” условным логическим операторам ИЛИ.
Оператор присваивания Оператор присваивания обозначается одиночным знаком равенства (=). В СФ оператор присваивания действует таким же образом, как и в других языках программирования. Ниже приведена его общая форма. имя переменной = вмравение Здесь имя переменной должно быть совместимо с типом выражения. У оператора присваивания имеется одна интересная особенность, о которой вам будет полезно знать: он позволяет создавать цепочку операций присваивания. Рассмотрим, например, следующий фрагмент кода: 1пк х, у, хк х = у = х = 1001 // присвоить значение 100 переменным х, у и з В приведенном выше фрагменте кода одно и то же значение 100 задается для переменных х, у и з с помощью единственного оператора присваивания.
Это значение присваивается сначала переменной х, затем переменной у и, наконец, переменной х. Такой способ присваивания по цепочке удобен для задания общего значения целой группе переменных. Составные операторы присваивания В С№ предусмотрены специальные составные операторы присваивания, упрощающие программирование некоторых операций присваивания. Обратимся сначала к простому примеру. Приведенный ниже оператор присваивания х = х а 101 можно переписать, используя следующий составной оператор присваивания: х += 101 Пара операторов += указывает компилятору на то, что переменной х должно быть присвоено ее первоначальное значение, увеличенное на 10. Рассмотрим еще один пример.
Оператор Глава 4. Операторы 103 х = х — 100 и оператор х -= 1ОО; выполняют одни и те же действия. Оба оператора присваивают переменной х ее первоначальное значение, уменьшенное на 100. Для многих двоичных операций, т.е. операций, требующих наличия двух операндов, существуют отдельные составные операторы присваивания. Общая форма всех этих операторов имеет следующий вид: имн переменной ор = выражение где ор — арифметический или логический оператор, применяемый вместе с оператором присваивания.