Г. Шилдт - Полный справочник по C# (1160789), страница 21
Текст из файла (страница 21)
Другими словами, отних не будет никакого вреда, но зато сколько пользы! Ведь они помогут прояснить(для вас самих в первую очередь, не говоря уже о тех, кому придется разбираться вэтом без вас) точный порядок вычислений. Скажите, например, какое из следующихдвух выражений легче понять?х = y/3-34*temp+127;X = (у/3) - (34*temp) + 127;Приоритет операторовВ табл. 4.2 показан порядок выполнения С#-операторов (от высшего до самогонизкого). Эта таблица включает несколько операторов, которые описаны далее.Таблица 4.2. Приоритет С#-операторовНаивысший( ) [ ] . ++(постфиксный)—(постфиксный) c h e c k e d new s i z e o f!- Операторы приведения*/ %<<=>>=typeofuncheckedтипа +(унарный) -(унарный) ++(префиксный)—(префиксный)isI&&IIНизшийГлава 4. Операторы101Полныйсправочник поИнструкции управленияВэтой главе рассматриваются инструкции управления ходом выполнения С#программы.
Существует три категории управляющих инструкций: инструкциивыбора (if, switch), итерационные инструкции (состоящие из for-, while-, d o while- и foreach-циклов) и инструкции перехода (break, c o n t i n u e , goto, r e t u r n иthrow). За исключением инструкции throw, которая является частью С#-механизмаобработки исключительных ситуаций (и рассматривается в главе 13), все остальныеперечисленные выше инструкции описаны в этой главе.Инструкция i fИнструкция i f была представлена в главе 2, но здесь мы рассмотрим ее более детально.
Полный формат ее записи такой:if(условие) инструкция;else инструкция?Здесь под элементом инструкция понимается одна инструкция языка С#. Частьe l s e необязательна. Вместо элемента инструкция может быть использован блок инструкций. В этом случае формат записи if-инструкции принимает такой вид:if (условие)последовательность инструкцийelseпоследовательность инструкцийЕсли элемент условие, который представляет собой условное выражение, при вычислении даст значение ИСТИНА, будет выполнена if-инструкция; в противномслучае — else-инструкция (если таковая существует). Обе инструкции никогда невыполняются.
Условное выражение, управляющее выполнением if-инструкции,должно иметь тип bool.Рассмотрим простую программу, в которой используется if-else-инструкция дляопределения того, является число положительным или отрицательным.// Программа определяет, является число положительным// или отрицательным.using System;class PosNeg {public s t a t i c void Main() {inti;for(i=~5; i <=* 5;Console.Write("Тестирование " + i + ": ") ;if(i < 0) Console.WriteLine("Число отрицательно"else Console.WriteLine("Число положительно");Глава 5. Инструкции управления103Результаты выполнения программы выглядят так:Тестирование -5: Число отрицательноТестирование - 4 : Число отрицательноТестирование -3: Число отрицательноТестирование - 2 : Число отрицательноТестирование -1: Число отрицательноТестирование 0: Число положительноТестирование 1: Число положительноТестирование 2: Число положительноТестирование 3: Число положительноТестирование 4: Число положительноТестирование 5: Число положительноЕсли оказывается, что в этом примере значение переменной i меньше нуля, выполняется if-инструкция (выводится "диагноз": Число отрицательно); в противномслучае — else-инструкция (выводится "диагноз": Число положительно).
Обе инструкции вместе ни при каких условиях выполнены не будут.Вложенные if-инструкцииВложенные if-инструкции образуются в том случае, если в качестве элемента инструкция (см. полный формат записи) используется другая if-инструкция. Вложенные if-инструкции очень популярны в программировании. Главное здесь — помнить,что else-инструкция всегда относится к ближайшей if-инструкции, которая находится внутри того же программного блока, но еще не связана ни с какой другойelse-инструкцией. Вот пример:if(i == 10){if (j < 20)a = b;if(k> 100)с = d;else a = с; // Эта else-инструкция// относится к if(k > 100).}else a = d; // Эта else-инструкция относится к if(i == 10).Как утверждается в комментариях, последняя else-инструкция не связана с инструкцией i f (j < 20), поскольку они не находятся в одном блоке (несмотря на то чтоэта if-инструкция — ближайшая, которая не имеет при себе "else-пары").
Внутренняя else-инструкция связана с инструкцией i f (к > 100), поскольку она — ближайшая и находится внутри того же блока.В предыдущей программе нулевое значение тестируемой переменной интерпретировалось как положительное.
Однако в некоторых приложениях нуль рассматриваетсякак значение без знака. Поэтому в следующей версии программы, которая демонстрирует использование вложенных else-инструкций, нулю дается именно такая характеристика: "без знака".// Программа определяет, является число положительным,// отрицательным или нулем.using System;class PosNegZero {public static void Main() {int i;for(i=-5; i <= 5; i104Часть I.
Язык С#Console.Write("Тестирование " + i + ": " ) ;if(i < 0) Console.WriteLine("Число отрицательно");else if(i == 0) Console.WriteLine("Число без знака");else Console.WriteLine("Число положительно");Вот какие получаем результаты:ТестированиеТестированиеТестированиеТестированиеТестированиеТестированиеТестированиеТестированиеТестированиеТестированиеТестирование-5: Число отрицательно- 4 : Число отрицательно-3: Число отрицательно- 2 : Число отрицательно-1: Число отрицательно0: Число без знака1: Число положительно2: Число положительно3: Число положительно4: Число положительно5: Число положительноКонструкция i f - e l s e - i fОчень распространенной в программировании конструкцией, в основе которойлежит вложенная if-инструкция, является "лестница" i f - e l s e - i f .
Ее можно представить в следующем виде:if {условие)инструкция;else if{условие)инструкция;else if{условие)инструкция;elseинструкция;Здесь под элементом условие понимается условное выражение. Условные выражения вычисляются сверху вниз. Как только в какой-нибудь ветви обнаружится истинный результат, будет выполнена инструкция, связанная с этой ветвью, а вся остальная "лестница" опускается. Если окажется, что ни одно из условий не являетсяистинным, будет выполнена последняя else-инструкция (можно считать, что она выполняет роль условия, которое действует по умолчанию).
Если последняя e l s e инструкция не задана, а все остальные оказались ложными, то вообще никакое действие не будет выполнено.Работа if-else-if-''лестницы" демонстрируется в следующей программе, котораянаходит для заданного значения наименьший множитель (отличный от единицы и состоящий из одной цифры).// Определение наименьшего множителя,// состоящего из одной цифры.using System;Глава 5. Инструкции управления105class Ladder {public s t a t i c void Main() {int num;for(num = 2; num < 12; num++) {if((num % 2) == 0)Console.WriteLine("Наименьший множитель числа " +num + " равен 2 .
" ) ;else if((num % 3) == 0)Console.WriteLine("Наименьший множитель числа " +num + " равен 3 . " ) ;else if((num % 5) == 0)Console.WriteLine("Наименьший множитель числа " +num + " равен 5.");else if((num % 7) == 0)Console.WriteLine("Наименьший множитель числа " +num + " равен 7.");elseConsole.WriteLine(num +" не делится на 2, 3, 5 или 7 . " ) ;Результаты выполнения этой профаммы выглядят так:Наименьший множитель числа 2 равен 2.Наименьший множитель числа 3 равен 3.Наименьший множитель числа 4 равен 2.Наименьший множитель числа 5 равен 5.Наименьший множитель числа б равен 2.Наименьший множитель числа 7 равен 7.Наименьший множитель числа 8 равен 2.Наименьший множитель числа 9 равен 3.Наименьший множитель числа 10 равен 2.11 не делится на 2, 3, 5 или 7.Как видите, последняя else-инструкция выполняется только в том случае, если невыполнилась ни одна из предыдущих if-инструкций.ИНСТРУКЦИЯ s w i t c hВторой инструкцией выбора является switch.
Инструкция switch обеспечиваетмногонаправленное ветвление. Она позволяет делать выбор одной из множества альтернатив. Хотя многонаправленное тестирование можно реализовать с помощью последовательности вложенных if-инструкций, для многих ситуаций инструкцияswitch оказывается более эффективным решением.
Она работает следующим образом. Значение выражения последовательно сравнивается с константами из заданногосписка. При обнаружении совпадения для одного из условий сравнения выполняетсяпоследовательность инструкций, связанная с этим условием. Общий формат записиинструкции switch такой:switch(выражение) {case константа1:последовательность инструкцийbreak;case константа2:106Часть I. Язык С#последовательность инструкцийbreak;case константаЗ:последовательность инструкцийbreak;default:последовательностьbreak;инструкций}Элемент выражение инструкции switch должен иметь целочисленный тип(например, char, byte, s h o r t или i n t ) или тип s t r i n g (о котором речь пойдет нижев этой книге). Выражения, имеющие тип с плавающей точкой, не разрешены.
Оченьчасто в качестве управляющего switch-выражения используется просто переменная;case-константы должны быть литералами, тип которых совместим с типом заданноговыражения. При этом никакие две case-константы в одной switch-инструкции немогут иметь идентичных значений.Последовательность инструкций default-ветви выполняется в том случае, если ниодна из заданных case-констант не совпадет с результатом вычисления switchвыражения. Ветвь d e f a u l t необязательна. Если она отсутствует, то при несовпадении результата выражения ни с одной из case-констант никакое действие выполненоне будет.