Страница 19 из 188
Результат выполнения этой программы приведен ниже.Результат и остаток от деления 10 / 3: 3 1Результат и остаток от деления 10.0 / 3.0: 3.33333333333333 1
Как видите, обе операции, % целочисленного типа и с плавающей точкой, даютодин и тот же остаток, равный 1.Операторы инкремента и декремента
Операторы инкремента (++) и декремента (--) были представлены в главе 2. Какстанет ясно в дальнейшем, они обладают рядом особых и довольно интересных свойств.Но сначала выясним основное назначение этих операторов.
Оператор инкремента увеличивает свой операнд на 1, а оператор декрементауменьшает операнд на 1. Следовательно, операторх++;
равнозначен операторух = x + 1;
а операторх--;
равносилен операторух = х - 1;
Следует, однако, иметь в виду, что в инкрементной или декрементной форме значение переменной х вычисляется только один, а не два раза. В некоторых случаях этопозволяет повысить эффективность выполнения программы.
Оба оператора инкремента и декремента можно указывать до операнда (в префиксной форме) или же после операнда (в постфиксной форме). Например, операторх = х + 1;
может быть записан в следующем виде:++х; // префиксная форма
или же в таком виде:х++; // постфиксная форма
В приведенном выше примере форма инкремента (префиксная или постфиксная)особого значения не имеет. Но если оператор инкремента или декремента используется в длинном выражении, то отличие в форме его записи уже имеет значение. Когдаоператор инкремента или декремента предшествует своему операнду, то результатомоперации становится значение операнда после инкремента или декремента. А когдаоператор инкремента или декремента следует после своего операнда, то результатомоперации становится значение операнда до инкремента или декремента. Рассмотримследующий фрагмент кода.х = 10;у = ++х;
В данном случае значение переменной у будет установлено равным 11, посколькузначение переменной х сначала увеличивается на 1, а затем присваивается переменнойу. Но во фрагменте кодах = 10;у = х++;
значение переменной у будет установлено равным 10, так как в этом случае значениепеременной х сначала присваивается переменной у, а затем увеличивается на 1. В обоих случаях значение переменной х оказывается равным 11. Отличие состоит лишь том,когда именно это значение станет равным 11: до или после его присваивания переменной у.
Возможность управлять моментом инкремента или декремента дает немало преимуществ при программировании. Обратимся к следующему примеру программы,в которой формируется последовательный ряд чисел.// Продемонстрировать отличие между префиксной// и постфиксной формами оператора инкремента (++).using System;class PrePostDemo { static void Main() { int x, y; int i; x = 1; У = 0; Console.WriteLine("Ряд чисел, полученных " + "с помощью оператора у = у + х++;"); for(i = 0; i < 10; i++) { у = у + х++; // постфиксная форма оператора ++ Console.WriteLine(у + " "); } Console.WriteLine(); x = 1; У = 0; Console.WriteLine("Ряд чисел, полученных " + "с помощью оператора у = у + ++х;"); for(i = 0; i < 10; i++) { у = у + ++х; // префиксная форма оператора ++ Console.WriteLine(у + " "); } Console.WriteLine(); }}
Выполнение этой программы дает следующий результат.Ряд чисел, полученных с помощью оператора у = у + х++1361015142128364555Ряд чисел, полученных с помощью оператора у = у + ++х;25914202735445465
Как подтверждает приведенный выше результат, в оператореу = у + х++;
первоначальное значение переменной х складывается с самим собой, а полученныйрезультат присваивается переменной у. После этого значение переменной х увеличивается на 1. Но в оператореу = у + ++х;
значение переменной х сначала увеличивается на 1, затем складывается с первоначальным значением этой же переменной, а полученный результат присваивается переменной у. Как следует из приведенного выше результата, простая замена префикснойформы записи оператора ++х постфиксной формой х++ приводит к существенномуизменению последовательного ряда получаемых чисел.
И еще одно замечание по поводу приведенного выше примера: не пугайтесь выражений, подобных следующему:у + ++x
Такое расположение рядом двух операторов может показаться не совсем привычным, но компилятор воспримет их в правильной последовательности. Нужно лишьзапомнить, что в данном выражении значение переменной у складывается с увеличенным на 1 значением переменной х.Операторы отношения и логические операторы
В обозначениях оператор отношения и логический оператор термин отношения означает взаимосвязь, которая может существовать между двумя значениями, а терминлогический — взаимосвязь между логическими значениями "истина" и "ложь". И поскольку операторы отношения дают истинные иди ложные результаты, то они нередко применяются вместе с логическими операторами. Именно по этой причине они ирассматриваются совместно в данном разделе.
Ниже перечислены операторы отношения.ОператорЗначение==Равно!=Не равно>Больше<Меньше>Больше или равно<=Меньше или равно
К числу логических относятся операторы, приведенные ниже.
Результатом выполнения оператора отношения или логического оператора является логическое значение типа bool.
В целом, объекты можно сравнивать на равенство или неравенство, используя операторы отношения == и !=. А операторы сравнения <, >, <= или >= могут применятьсятолько к тем типам данных, которые поддерживают отношение порядка. Следовательно, операторы отношения можно применять ко всем числовым типам данных. Но значения типа bool могут сравниваться только на равенство или неравенство, посколькуистинные (true) и ложные (false) значения не упорядочиваются. Например, сравнение true > false в C# не имеет смысла.
Операнды логических операторов должны относиться к типу bool, а результат выполнения логической операции также относится к типу bool. Логические операторы&, |, ^ и ! поддерживают основные логические операции И, ИЛИ, исключающее ИЛИи НЕ в соответствии с приведенной ниже таблицей истинности.pqp & qp | qp ^ q|Pfalsefalsefalsefalsefalsetruetruefalsefalsetruetruefalsefalsetruefalsetruetruetruetruetruetruetruefalsefalse
Как следует из приведенной выше таблицы, результатом выполнения логическойоперации исключающее ИЛИ будет истинное значение (true), если один и толькоодин ее операнд имеет значение true.
Ниже приведен пример программы, демонстрирующий применение несколькихоператоров отношения и логических операторов.// Продемонстрировать применение операторов// отношения и логических операторов.using System;class RelLogOps { static void Main() { int i, j; bool b1, b2; i = 10; j = 11; if(i < j) Console.WriteLine("i < j"); if(i <= j) Console.WriteLine("i <= j"); if(i != j) Console.WriteLine("i != j"); if(i == j) Console.WriteLine("Нельзя выполнить"); if(i >= j) Console.WriteLine("Нельзя выполнить"); if(i > j) Console.WriteLine("Нельзя выполнить"); b1 = truer b2 = false; if(b1 & b2) Console.WriteLine("Нельзя выполнить"); if(!(b1 & b2)) Console.WriteLine("!(b1 & b2) — true"); if(b1 | b2) Console.WriteLine("b1 | b2 - true"); if(b1 ^ b2) Console.WriteLine("bl ^ b2 — true"); }}
Выполнение этой программы дает следующий результат.i < ji <= ji != j!(b1 & b2) — trueb1 | b2 — trueb1 ^ b2 — true
Логические операторы в C# выполняют наиболее распространенные логическиеоперации. Тем не менее существует ряд операций, выполняемых по правилам формальной логики. Эти логические операции могут быть построены с помощью логических операторов, поддерживаемых в С#. Следовательно, в C# предусмотрен такой набор логических операторов, которого достаточно для построения практически любойлогической операции, в том числе импликации. Импликация — это двоичная операция, результатом которой является ложное значение только в том случае, если левыйее операнд имеет истинное значение, а правый — ложное. (Операция импликации отражает следующий принцип: истина не может подразумевать ложь.) Ниже приведенатаблица истинности для операции импликации.pqРезультат импликации p и qtruetruetruetruefalsefalsefalsefalsetruefalsetruetrue