Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 [120] 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

В С++ вы можете добиться того же эффекта без использования goto, как показано в следующем примере. Если язык не поддерживает команду break, вы можете эмулировать ее, применив goto.

Пример кода, переписанного без использования goto - лучший вариант (С++)

while ( true ) {

Блоки перед и после break поменяны местами.

Делаем что-то еще.

if ( !( expression ) ) { break;

Делаем что-то.

Когда использовать цикл for

Щштшпьтп ттш О Цл for - хороший вариант, если вам нужен цикл, выпол-

щтшжйрттщтт ¥Шть няющийся определенное количество раз. Вы можете исполь-

zmmm щтт for т. 0 «Ш- зовать for в С++, С, Java, Visual Basic и большинстве других

\щ Шй Соёе» {Шщтх% ШЗ). языков.

Применяйте циклы for в простых случаях, не требующих управления изнутри тела цикла. Используйте их, когда управление циклом заключается в простом инкременте или декременте, скажем, при проходе по элементам контейнера. Особенность цикла/ог в том, что его надо настроить в начале выполнения и забыть о нем. Вам ничего не надо делать внутри него для управления его работой. Если существует условие, по которому выполнение цикла прерывается изнутри, вместо for используйте конструкцию wbile.

Не изменяйте значение индекса цикла for явно, чтобы принудительно его завершить. Вместо этого используйте wbile. Цикл for предназначен для простых случаев. Более сложные задачи организации циклов лучше решать с помощью цикла wbile.

Когда использовать цикл foreach

Цикл foreacb (или его эквиваленты For-Eacb в Visual Basic,/ог-ш в Python) полезен для выполнения действий над каждым элементом массива или другого контейнера. Его преимущество в том, что он позволяет обойтись без вспомогательной арифметики для обслуживания цикла и, таким образом, избежать ошибок. Вот пример такого цикла:



Пример цикла foreach (С#)

int [] fibonacciSequence = new int [] { О, 1, 1, 2, 3, 5, 8, 13, 21, 34 }; int oddFibonacciNumbers = 0; int evenFibonacciNumbers = 0;

Подсчитываем количество четных и нечетных чисел в последовательности Фибоначчи, foreach ( int fibonacciNumber in fibonacciSequence ) { if ( fibonacciNumber % 2 ) 0 ) { evenFibonacciNumbers++;

else {

oclclFibonacciNumbers++;

Console.WriteLine( "Found {0} odd numbers and {1} even numbers.", OddFibonacciNumbers, evenFibonacciNumbers );

16.2. Управление циклом

Что плохого может случиться с циклом? Любой ответ должен включать некорректную или пропущенную инициализацию цикла, невыполненную инициализацию накопительных переменных (или других переменных, относящихся к циклу), неправильную вложенность, неправильное завершение цикла, отсутствие инкре-ментации переменной цикла или ее неправильную инкрементацию, а также неправильное индексирование элемента массива с помощью индекса цикла.

Вы можете предотвратить эти проблемы, соблюдая два правила. Во-первых, минимизируйте число факторов, влияющих на цикл. Упрощайте, упрощайте и еще раз упрощайте! Во-вторых, рассматривайте содержимое цикла так, будто это метод: вынесите за пределы цикла все управление, какое только возможно. Явно объявите все условия выполнения тела цикла. Не заставляйте читателя смотреть внутрь цикла, чтобы понять его управление. Думайте о цикле, как о черном ящике: окружающий код знает об управляющих условиях, но не о содержимом цикла.

Пример представления цикла в виде черного ящика (С++) тттпш tmm Ыт $ы

while ( ! inputFile. EndOfFileO && moreDataAvailable ) { ттпьут штптш While

При каких условиях этот цикл завершится? Очевидно, все, го условие выхода находлтся что вам известно, что или inputFileEndOJFileO станет исти- JJZ. ной, или MoreDataAvailable станет ложью.

Вход в цикл

Следуйте принципам, приведенным далее, при разработке

если ш иапользуетб только одно %тш выхода, ш терй-ете преимущество рассмотрения цикла ь виде нерного ящика

входа в цикл.



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

Размещайте инициализационный код непосредственно перед циклом

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

ПШ1ша&141ай тхш Об ы тл Поместите операторы инициализации цикла рядом с этим mvm обшстй аидймости пере- циклом. Если вы этого не сделаете, то, вполне вероятно, это ищтх цйкяа с«*. подраадвп приведет к ошибкам, когда вы соберетесь преобразовать Огрши%т#0щймостытмей» данный цикл в цикл большего размера и забудете исправить Hyx-HHii8KeoB цикла сами» инициализационный код. Такая же ошибка может возник-щт 8 этой тш. путь, когда вы переместите или скопируете код цикла в

другой метод, забыв переместить инициализационный код. Размещение кода инициализации вдали от цикла - в разделе объявления данных или во вспомогательном разделе в начале метода - грозит неприятностями с инициализацией.

Используйте while (true) для бесконечных циклов Вам может понадобиться цикл, выполняющийся без завершения, - например, цикл в таких изделиях, как кардиостимулятор или микроволновая печь. Или цикл должен завершаться только в ответ на событие - так называемый «событийный цикл». Вы можете закодировать такой бесконечный цикл несколькими способами. Имитация цикла с помощью выражений вида for г = 1 to 99999 - плохая идея, поскольку конкретное значение границ цикла скрывает его смысл: 99999 может быть вполне допустимым значением. Кроме того, такой фальшивый бесконечный цикл плохо поддается сопровождению.

Идиома гиЫ1е( true ) считается стандартным способом написания бесконечных циклов в С++, Java, Visual Basic и других языках, поддерживающих операции сравнения. Некоторые программисты предпочитают использовать for(;;) - это приемлемая альтернатива.

Предпочитайте циклы for, если они применимы В цикле for управляющий код находится в одном месте, что способствует созданию легко читаемых циклов. При модификации ПО программисты часто делают ошибку, изменяя код инициализации в начале цикла while и забывая исправить соответствующий код в конце цикла. В цикле for необходимый код расположен в начале цикла, что упрощает модификацию кода. Если вы можете использовать цикл for вместо других циклов, сделайте это.

Не используйте цикл for, если цикл while подходит больше Обычным злоупотреблением гибкой структурой цикла for в языках С++, С* и Java является размещение частей цикла while в заголовке цикла for. Взгляните на цикл while, втиснутый в заголовок цикла for.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 [120] 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0071