Использование операторов инкремента и декремента...70
Очень часто для какого-либо подсчёта в циклах программисты используют операторы инкремента или декремента. Заметим, что в следующем фрагменте программы WhileDemo для уменьшения значения счётчика используются операторы присвоения и вычитания:
while ( loopCount > 0 )
{
loopCount = loopCount - 1 ;
cout << "Осталось выполнить "
<< loopCount << " циклов\n" ;
}
Используя оператор декремента, этот цикл можно записать более компактно:
/* В цикле выводим значения */
while ( loopCount > 0 )
{
loopCount-- ;
cout << "Осталось выполнить "
<< loopCount << " циклов\n" ;
}
Смысл этого варианта цикла полностью совпадает со смыслом оригинала. Единственная разница — в способе записи.
Поскольку оператор декремента одновременно уменьшает аргумент и возвращает его значение, он может включаться в условие цикла while. В частности, допустима следующая версия цикла:
/* В цикле выводим значения */
while ( loopCount-- > 0 )
{
cout << "Осталось выполнить "
<< loopCount << " циклов\n" ;
}
Хотите — верьте, хотите — нет, но большинство программистов на С++ используют именно этот вариант записи. И не потому, что им нравится быть остроумными; хотя почему бы и нет? Использование в логических сравнениях операторов инкремента и декремента делает программный код легко читаемым и более компактным. И вряд ли вы, исходя из своего опыта, сможете предложить достойную альтернативу.
«И в выражении loopCount--, и в --loopCount значение loopCount уменьшается; однако первое возвращает значение переменной loopCount перед его уменьшением на 1, а второе — после.»
[Помни!]
Сколько раз будет выполняться декрементированный вариант WhileDemo, если пользователь введёт число 1? Если использовать префиксный вариант, то значение --loopCount равно 0 и тело цикла никогда не выполнится. В постфиксном варианте loopCount-- возвратит 1 и программа передаст управление в начало цикла.
У вас может сложиться ошибочное мнение, что программа, в которой используются операторы декремента, выполняется быстрее, так как содержит меньше инструкций. Однако это не совсем так. Время выполнения программы не зависит от того, с какой из представленных выше операций декремента вы работаете, так как современные оптимизирующие компиляторы используют минимально необходимое количество инструкций машинного языка, независимо от применяемых для декремента операторов.
_________________
70 стр. Часть 1. Первое знакомство с С++
Использование цикла for...71
Другой разновидностью циклов является цикл for. Его часто предпочитают более простому циклу while. Цикл for имеет следующий вид:
for ( инициализация ; условие ; увеличение )
{
// ...тело цикла
}
Выполнение цикла for начинается с инициализации. В ней обычно находится оператор присвоения, используемый для установки начального значения переменной цикла. Условие инициализации выполняется только один раз, при первом входе в цикл for.
Затем проверяется условие. Подобно циклу while, цикл for выполняется до тех пор, пока условие не станет ложным.
После того как выполнится код тела цикла, управление получит следующий параметр цикла for ( увеличение[ 11 ]) и значение счётчика изменится. Затем опять будет выполнена проверка условия, и процесс повторится. В этом параметре обычно записывают инкрементное или декрементное выражение, которое определяет характер изменения переменной цикла на каждой итерации, но в принципе ограничений на используемые здесь операторы нет. Цикл for можно заменить эквивалентным ему циклом while:
11
Увеличение в данном случае — достаточно условное название. Чаще всего здесь действительно выполняется увеличение счётчика цикла, однако это может быть любая инструкция С++, в том числе и пустая.