Г. Шилдт - С#4.0 Полное руководство (1160795), страница 20
Текст из файла (страница 20)
Этим укороченным логическим операторам соответствуют обычные логические операторы ь и ). Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости. В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной г( на значение переменной и нацело.
Если остаток от деления и/г) равен нулю, то и делится на г( нацело. Глава 4. Операторы 105 Но поскольку данная операция подразумевает деление, то для проверки условия деле- ния на нуль служит укороченный логический оператор И. // Продемонстрировать применение укороченных логических операторов. цзьпд зузсеш; с1азз ЯСорз зсас1с чоьб пази() ( ьпг п, б) п = 10; б = г) ьт(б != 0 аа (и % б) == 0) сопзо1е.нгьгеььпе(п + " делится нацело на " + б); б = 0; // задать нулевое значение переменной б равно нулю, поэтому второй операнд не вычисляется 11(б != 0 ЬЬ (п % б) == О) сопзо1е.хгьгеььпе(п + " делится нацело на " + б)) Если теперь попытаться сделать то ке самое без укороченного логического оператора, то возникнет ошибка из-за деления на нуль.
ьт(б != 0 Л (п % б) == 0) Сопзо1е.нг1се11пе(п + " делится нацело на " + б)) Для исключения ошибки из-за деления на нуль в операторе 1Г сначала проверяется условие: равно ли нулю значение переменной б. Если оно равно нулю, то на этом выполнение укороченного логического оператора И завершается, а последующая операция деления по модулю не выполняется. Так, при первой проверке значение переменной б оказывается равным 2, поэтому выполняется операция деления по модулю.
А при второй проверке это значение оказывается равным нулю, следовательно, операция деления по модулю пропускается, чтобы исключить деление на нуль. И наконец, выполняется обычный логический оператор И, когда вычисляются оба операнда. Если при этом происходит деление на нуль, то возникает ошибка при выполнении. Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектное.
Рассмотрим следующий пример программы. // Продемонстрировать значение побочных эффектов. цз1пч яу*сеш) с1азз Бьбебттесоз зсас1с чоьб Ма1п() ( 1пг 1; Ьоо1 зошеСопбьгьоп = Га1зе) 0; 106 часть!. язык С() Значение переменной г инкрементируется, несмотря на то, что оператор гг не выполняется. 1Г(воиеСопсьсгоп ь (++1 < 100)) Сопво1е.игьсесьпе("Не выводится"); Сопво1е.игьгеЬгпе("Оператор 1Г выполняется: " + 1); г'/ выводится 1 // В данном случае значение переменной 1 не инкрементируется, г/ поскольку инкремент в укороченном логическом операторе опускается. 1Г(воиесопг)1Г1оп Ва (++1 < 100)) Сопво1е.иггсепьпе("Не выводится"); СОПВО1Е.ХГ1<Еь1ПЕ("ОПЕратср ЛГ ВЫПОЛНяЕтСя: " Е Г)1 // ПО-ПрЕжНЕМу 1 )) ) ) Прежде всего обратим внимание на то, что переменная зоыеСопс)101оп типа Ьоо1 инициализируется значением га1зе.
Далее проанализируем каждый оператор 1Г. Как следует из комментариев к данной программе, в первом операторе 1Е переменная 1 инкрементируется, несмотря на то что значение переменной зогпеСопс(101оп равно Га1зе. Когда применяется логический оператор ь, как это имеет место в первом операторе ьг, выражение в правой части этого оператора вычисляется независимо от значения выражения в его левой части. А во втором операторе 1 г применяется укороченный логический оператор. В этом случае значение переменной 1 не инкрементируется, поскольку левый операнд (переменная зогпеСопс(101оп) имеет значение га1зе, следовательно, выражение в правой части данного оператора пропускается. Из этого следует вывод; если в коде предполагается вычисление правого операнда логической операции И либо ИЛИ, то необходимо пользоваться неукороченными формами логических операций, доступных в С(). И последнее замечание: укороченный оператор И называется также условным логическим оператором И, а укороченный оператор ИЛИ вЂ” условным логическим опратором ИЛИ.
Оператор присваивания Оператор присваивания обозначается одиночным знаком равенства (=). В С)) оператор присваивания дейсгэует таким же образом, как и в других языках программирования. Ниже приведена его общая форма. нмя переменной = выражвннЕ Здесь нмя переменной должно быть совместимо с типом выражения. У оператора присваивания имеется одна интересная особенность, о которой вам будет полезно знать: он позволяет создавать цепочку операций присваивания.
Рассмотрим, например, следующий фрагмент кода. 1пг х у гг х = у = г = 100; // присвоить значение 100 переменным х, у и г В приведенном выше фрагменте кода одно и то же значение 100 задается для переменных х, у и г с помощью единственного оператора присваивания. Это значение присваивается сначала переменной з, затем переменной у и, наконец, переменной х. Такой способ присваивания "по цепочке" удобен для задания общего значения целой группепеременных. Глава 4. Операторы 107 Составные операторы присваивания В СФ предусмотрены специальные составные операторы присваивания, упрощающие программирование некоторых операций присваивания. Обратимся сначала к простому примеру. Приведенный ниже оператор присваивания х = х е 10; можно переписать, используя следующий составной оператор присваивания. х ч= 10; Пара операторов ч= указывает компилятору на то, что переменной х должно быть присвоено ее первоначальное значение, увеличенное на 10. Рассмотрим еще один пример.
Оператор х=н — 100; и оператор х -= 100; выполняют одни и те же действия. Оба оператора присваивают переменной х ее первоначальное значение, уменьшенное на 100. Для многих двоичных операций, т.е. операций, требующих наличия двух операндов, существуют отдельные составные операторы присваивания. Общая форма всех этих операторов имеет следующий вид: имя переменной ер = выражение где ор — арифметический или логический оператор, применяемый вместе с оператором присваивания. Ниже перечислены составные операторы присваивания для арифметических и логических операций.
Составные операторы присваивания записываются более кратко, чем их несоставные эквиваленты. Поэтому их иногда еще называют укороченными операторами нрисаанвания. У составных операторов присваивания имеются два главных преимущества. Вопервых, они более компактны, чем их "несокращенные" эквиваленты. И во-вторых, они дают более эффективный исполняемый код, поскольку левый операнд этих операторов вычисляется только один раз. Именно по этим причинам составные операторы присваивания чаще всего применяются в программах, профессионально написанных на СФ. Поразрядные операторы В СФ предусмотрен ряд поразрядных операторов, расширяющих круг задач, для решения которых можно применять Св. Поразрядные операторы воздействуют на отдельные двоичные разряды (биты) своих операндов. Они определены только для целочисленных операндов, поэтому их нельзя применять к данным типа Ьоо1, !!оат или г!онЬ1е.
108 Часть Е Язык С№ Эти операторы называются лоразряднылги, поскольку они служат для проверки, установки или сдвига двоичных разрядов, составляющих целое значение. Среди прочего поразрядные операторы применяются для решения самых разных задач программирования на уровне системы, включая, например, анализ информации состояния устройства. Все доступные в СФ поразрядные операторы приведены в табл. 4.1. Таблица 4Л. Поразрядные операторы Оператор Значение » « Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ обозначаются следующим образом; а, Н " и -.
Они выполняют те же функции, что и их логические аналоги, рассмотренные выше. Но в отличие от логических операторов, поразрядные операторы действуют на уровне отдельных двоичных разрядов. Ниже приведены результаты поразрядных операций с двоичными единицами и нулями. Р Ч Рву Р!Ч Р Ч С точки зрения наиболее распространенного применения поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен О, то соответствующий бит результата будет сброшен в О.