1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 17
Текст из файла (страница 17)
В C# определены также операторы для обработки специальныхситуаций, но их мы рассмотрим после изучения средств, к которым они применяются.Арифметические операторыВ C# определены следующие арифметические операторы.ОператорДействие+*/%-++СложениеВычитание, унарный минусУмножениеДелениеДеление по модулюДекрементИнкрементДействие C#-операторов +, -, * и / совпадает с действием аналогичных операторов влюбом другом языке программирования (да и в алгебре, если уж на то пошло). Их можноприменять к данным любого встроенного числового типа.Хотя действия арифметических операторов хорошо известны всем читателям,существуют ситуации, которые наверняка потребуют специальных разъяснений.
Преждевсего хочу напомнить, что после применения оператора деления (/) к целому числу остатокбудет отброшен. Например, результат целочисленного деления 10/3 будет равен 3.Остаток от деления можно получить с помощью оператора деления по модулю (%). Этотоператор работает практически так же, как в других языках программирования: возвращаетостаток от деления нацело. Например, 10 % 3 равно 1. В C# оператор % можно применитькак к целочисленным типам, так и типам с плавающей точкой.
Например, 10,0 % 3,0также равно 1. (В языках C/C++ операции деления по модулю применимы только кцелочисленным типам.) Использование оператора деления по модулю демонстрируется вследующей программе.// Демонстрация использования оператора %.using System;class ModDemo {public static void Main() {int iresult, irem;double dresult, drem;iresult =10/3;irem = 10 % 3;dresult = 10.0 / 3.0;drem = 10.0 % 3.0;Глава 4.
Операторы81Console.WriteLine("Результат и остаток от деления 10/3: " +iresult + " " + irem);}}Console.WriteLine("Результат и остаток от деления 10.0 / 3.0: " +dresult + " " + drem);Результат выполнения этой программы таков:Результат и остаток от деления 10 / 3: 3 1Результат и остаток от деления 10.0 / 3.0: 3,33333333333333 1Как видите, оператор % генерирует остаток, равный 1, как при делениицелочисленных значений, так и значений с плавающей точкой.Инкремент и декрементОператоры инкремента (++) и декремента (--) увеличивают и уменьшают значениеоперанда на единицу, соответственно.
Как будет показано ниже, эти операторы обладаютспециальными свойствами, которые делают их весьма интересными для рассмотрения.Итак, оператор инкремента выполняет сложение операнда с числом 1, а оператордекремента вычитает 1 из своего операнда. Это значит, что инструкцияx = x + 1;аналогична такой инструкции:x++;Точно так же инструкцияx = x - 1;аналогична такой инструкции:x--;Операторы инкремента и декремента могут стоять как перед своим операндом, так ипосле него.
Например, инструкциюx = x + 1;можно переписать в виде префиксной формы++x; // Префиксная форма оператора инкремента.или в виде постфиксной формы:x++; // Постфиксная форма оператора инкремента.В предыдущем примере не имело значения, в какой форме был применен операторинкремента: префиксной или постфиксной. Но если оператор инкремента или декрементаиспользуется как часть большего выражения, то форма его применения имеет важноезначение. Если такой оператор применен в префиксной форме, то C# сначала выполнит этуоперацию, чтобы операнд получил новое значение, которое затем будет использованоостальной частью выражения.
Если же оператор применен в постфиксной форме, то C#использует в выражении его старое значение, а затем выполнит операцию, в результатекоторой операнд обретет новое значение. Рассмотрим следующий фрагмент кода:x = 10;y = ++x;82Часть I. Язык C#В этом случае переменная y будет установлена равной 11. Но если в этом кодепрефиксную форму записи заменить постфиксной, переменная y будет установлена равной10:x = 10;y = x++;В обоих случаях переменная x получит значение 11.
Разница состоит лишь в том, вкакой момент она станет равной 11 (до присвоения ее значения переменной y или после).Для программиста очень важно иметь возможность управлять временем выполненияоперации инкремента или декремента. Рассмотрим следующую программу, котораягенерирует ряд чисел:/*Демонстрация различия между префиксной ипостфиксной формами оператора ++.*/using System;class PrePostDemo {public static void Main() {int x, y;int i;x = 1;Console.WriteLine("Ряд, построенный с помощью инструкции y = x + x++;");for(i = 0; i < 10; i++) {y = x + x++; // постфиксная форма оператора ++Console.WriteLine(y + " ");}Console.WriteLine();x = 1;}}Console.WriteLine("Ряд, построенный с помощью инструкции y = x + ++x;");for(i = 0; i < 10; i++) {y = x + ++x; // префиксная форма оператора ++Console.WriteLine(y + " ");}Console.WriteLine();Вот как выглядит результат выполнения этой программы:Ряд, построенный с помощью инструкции y = x + x++;2468101214Глава 4. Операторы83161820Ряд, построенный с помощью инструкции y = x + ++x;3579111315171921Как видно из результатов работы этой программы, инструкцияy = x + x++;сначала суммирует значения x и x, после чего присваивает результат переменной y.
Толькозатем она инкрементирует переменную x. Но инструкцияy = x + ++x;выполняется по-другому. Сначала она получает (и запоминает) исходное значениепеременной x, затем инкрементирует его, суммирует новое значение с исходным, арезультат суммирования присваивает переменной y. Нетрудно заметить, что простая заменаэлемента x++ элементом ++x меняет числовой ряд, генерируемый программой, с четногона нечетный. И еще. Выражениеx + ++x;на первый взгляд может показаться странным, но только не компилятору.
Несмотря настоящие рядом два оператора, компилятор позаботится о правильной последовательностиих выполнения. Достаточно понимать, что в этом выражении значение переменной xсуммируется с инкрементированным значением той же переменной x.Операторы отношения и логические операторыОператоры отношений оценивают по “двубальной системе” (ИСТИНА/ЛОЖЬ)отношения между двумя значениями, а логические определяют различные способысочетания истинных и ложных значений. Поскольку операторы отношений генерируютИСТИНА/ЛОЖЬ - результаты, то они часто выполняются с логическими операторами.Поэтому мы и рассматриваем их в одном разделе.Итак, перечислим операторы отношений.ОператорЗначение==!=><>=<=РавноНе равноБольшеМеньшеБольше или равноМеньше или равно84Часть I. Язык C#Приведем список логических операторов.ОператорЗначение&|^&&||!ИИЛИИсключающее ИЛИСокращенное ИСокращенное ИЛИНЕbool.Результат выполнения операторов отношений и логических операторов имеет типВ C# на равенство или неравенство можно сравнивать (соответственно, с помощьюоператоров == и !=) все объекты.
Но такие операторы сравнения, как <, >, <= или >=,можно применять только к типам, которые поддерживают отношения упорядочения. Этозначит, что все операторы отношений можно применять ко всем числовым типам. Однакозначения типа bool можно сравнивать только на равенство или неравенство, посколькузначения true и false не упорядочиваются. Например, в C# сравнение true > falseне имеет смысла.Что касается логических операторов, то их операнды должны иметь тип bool, ирезультат логической операции всегда будет иметь тип bool. Логические операторы &, |, ^и ! выполняют базовые логические операции И, ИЛИ, исключающее ИЛИ и НЕ всоответствии со следующей таблицей истинности.pqfalsetruefalsetruefalsefalsetruetruep&qfalsefalsefalsetruep|qfalsetruetruetruep^qfalsetruetruefalse!ptruefalsetruefalseКак видно из этой таблицы, операция “исключающее ИЛИ” сгенерирует результатИСТИНА лишь в случае, если истинен только один из ее операндов.Рассмотрим программу, которая демонстрирует использование операторовотношений совместно с логическими операторами.// Демонстрация использования операторов отношений// и логических операторов.using System;class RelLogOps {public 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("Это не будет выполнено.");Глава 4.
Операторы85if(iif(ib1 =b2 =}}>= j) Console.WriteLine("Это не будет выполнено.");> j) Console.WriteLine("Это не будет выполнено.");true;false;if(b1 &if(!(b1if(b1 |if(b1 ^b2) Console.WriteLine("Это не будет выполнено.");& b2)) Console.WriteLine("! (b1 & b2) -- ИСТИНА");b2) Console.WriteLine("b1 | b2 -- ИСТИНА");b2) Console.WriteLine("b1 ^ b2 -- ИСТИНА");Результат выполнения этой программы таков:i < ji <= ji != j!(b1 & b2) -- ИСТИНАb1 | b2 -- ИСТИНАb1 ^ b2 -- ИСТИНАРассмотренные выше логические операторы предназначены для выполнения самыхраспространенных логических операций.
Однако существует ряд других операций, которыеопределяются правилами формальной логики. Их также можно выполнить с помощьюлогических операторов C#. Так, C# поддерживает набор логических операторов, на базекоторых можно построить любую другую логическую операцию, например операциюимпликации. Импликация — это логическая операция, результат которой будет ложнымтолько в случае, когда левый операнд имеет значение ИСТИНА, а правый — ЛОЖЬ.(Операция импликации отражает идею о том, что истина не может подразумевать ложь.)Вот как выглядит таблица истинности для оператора импликации:pqРезультат импликации p и qtruetruefalsefalsetruefalsefalsetruetruefalsetruetrueОперацию импликации можно создать, используя комбинацию операторов ! и |.!p | qИспользование импликации демонстрируется в следующей программе:// Создание оператора импликации в языке C#.using System;class Implication {public 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;86Часть I.