Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




В С# предусмотрены специальные быстрые версии логических операторов AND и OR, при использовании которых программа будет выполняться быстрее. Рассмотрим, как они работают. Если при выполнении оператора AND первый операнд имеет значение false, результатом будет false, независимо от значения второго операнда. Если при выполнении оператора OR первый операнд имеет значение true, результатом будет значение true, независимо от значения второго операнда. Следовательно, в этих случаях нет необходимости оценивать второй операнд, и соответственно программа будет выполняться быстрее.

Быстрый оператор AND обозначается символом &&, а быстрый оператор OR - символом ||. Единственная разница между обычной и быстрой версиями операторов состоит в том, что обычные операторы всегда оценивают и первый, и второй операнды, а быстрые операторы оценивают второй операнд только при необходимости.

Ниже приведена программа, в которой демонстрируется использование быстрого оператора AND. Программа определяет, является ли значение переменной d кратным значению переменной n. Это осуществляется с помощью оператора взятия по модулю. Если остаток деления n/d равен нолю, то значение переменной d является делителем значения переменной n. Однако поскольку операция взятия по модулю предусматривает выполнение деления, в программе используется быстрый оператор AND для предотвращения деления на ноль.

// В программе демонстрируется использование быстрого оператора AND.

using System;

class SCops {
public static void Main() {
int n, d;

n = 10;
d = 2;
if(d!= 0 && (n % d) == 0)
Console.WriteLine(d + " является делителем числа " + n);

d = 0; // Теперь присваиваем переменной d значение 0.

// Поскольку переменная d имеет значение 0, второй операнд
// не оценивается.
if(d!= 0 && (n % d) == 0)
Console.WriteLine(d + " является делителем числа " + n);
Применение быстрого оператора предотвращает деление на ноль.

/* Теперь в выражении условия оператора if будет использован
обычный оператор AND, что приведет к делению на ноль.
*/
if(d!= 0 & (n % d) == 0)
Оцениваются оба операнда, что приводит к делению на ноль.
Console.WriteLine(d + " является делителем числа " + n);
}
}

Для предотвращения деления на ноль вначале оператор if проверяет, не равно ли нолю значение переменной d. Если равно, то быстрый оператор AND останавливает дальнейшее выполнение оператора и деление по модулю не выполняется. Поскольку в программе в первом случае значение переменной d равно 2, выполняется операция взятия по модулю. Во втором случае переменной d присваивается заведомо неприемлемое значение 0 и операция взятия по модулю не выполняется, в результате чего предотвращается деление на ноль. Наконец, в третьем случае используется обычный оператор AND. При этом оцениваются оба операнда, что приводит к ошибке выполнения программы при попытке деления на ноль.

Проект 2-2. Вывод таблицы истинности логических операторов

@S2 = LogicOpTable.cs

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

Пошаговая инструкция
1. Создайте новый файл и назовите его LogicalOpTable.cs.

2. Для выравнивания столбцов таблицы используйте escape-последовательность \t, которая вставляет символы табуляции в каждую строку вывода. Например, представленный ниже оператор WriteLine() выводит заголовок для таблицы:
Console.WriteLine("P\tQ\tAND\tOR\tXOR\tNOT");

3. Для каждой следующей строки таблицы используйте символы табуляции, чтобы поместить результат выполнения каждой операции под соответствующим заголовком.

4. Ниже представлен полный код программы, который нужно ввести в файл LogicalOpTable.cs.

/*
Проект 2-2
Выводит на печать таблицу истинности логических операторов.
*/

using System;

class LogicalOpTable {
public static void Main() {

bool p, q;

Console.WriteLine("P\tQ\tAND\tOR\tXOR\tNOT");
p = true; q = true;
Console.Write(p + "\t" + q +"\t");
Console.Write((p&q) + "\t" + (p|q) + "\t");
Console.WriteLine((p^q) + "\t" + (!p));

p = true; q = false;
Console.Write(p + "\t" + q +"\t");
Console.Write((p&q) + "\t" + (p|q) + "\t");
Console.WriteLine((p^q) + "\t" + (!p));

p = false; q = true;
Console.Write(p + "\t" + q +"\t");
Console.Write((p&q) + "\t" + (p|q) + "\t");
Console.WriteLine((p^q) + "\t" + (!p));

p = false; q = false;
Console.Write(p + "\t" + q +"\t");
Console.Write((p&q) + "\t" + (p|q) + "\t");
Console.WriteLine((p^q) + "\t" + (!p));
}
}

5. Скомпилируйте и запустите программу. В результате ее выполнения будет выведена следующая таблица:

P Q AND OR XOR NOT
true true true true false false
true false false true true false
false true false true true true
false false false false false true

6. Обратите внимание, что логические операторы, указываемые в методах Write() и WriteLine() в качестве параметров, заключены в круглые скобки. Это необходимо, поскольку в C# оператор + имеет более высокий приоритет, чем логические операторы.

7. Попытайтесь самостоятельно модифицировать программу таким образом, чтобы на экран выводились символы 1 и 0 вместо слов true и false. Возможно, это задача окажется достаточно сложной!

Вопрос. Зачем в С# нужны обычные операторы AND и OR, если в некоторых случаях быстрые операторы являются более эффективными?
Ответ.Иногда в операторах AND и OR требуется оценить оба операнда.

Это иллюстрируется следующей программой.

// Еще одна программа, в которой демонстрируется разница в
// применении быстрого и обычного операторов AND.

using System;

class SideEffects {
public static void Main() {
int i;
i = 0;

/* В выражении условия оператора if к переменной i будет
применена операция инкремента, даже если условие окажется ложным.
*/
if(false & (++i < 100))
Console.WriteLine("Эта строка не будет выведена.");
// Следующим оператором будет выведено
// значение переменной i, равное 1.
Console.WriteLine("Если оператор инкремента будет выполнен,"+
" переменная i примет значение: " + i);

/* В этом случае к переменной i не будет применена операция
инкремента, поскольку используется быстрый оператор AND.
*/
if(false && (++i < 100))
Console.WriteLine("Эта строка не будет выведена.");
// Следующим оператором вновь будет выведено
// значение переменной i, равное 1.
Console.WriteLine("Если оператор инкремента будет выполнен,"+
" переменная i примет значение: " + i);
}
}

Комментарии указывают, что в выражении условия первого оператора if к переменной i будет применена операция инкремента независимо от истинности выражения. Но при использовании быстрого оператора значение переменной i не будет увеличено на единицу, поскольку первый операнд имеет значение false. То есть этот пример показывает, что если в коде необходимо выполнить проверку операнда, находящегося справа от оператора AND, вы должны использовать обычную форму этого оператора (то же касается оператора OR).




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 684; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.