Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
#1

for и while - C++

17.10.2012, 10:47. Просмотров 1591. Ответов 32
Метки нет (Все метки)

Объясните плз, когда следует использовать for, а когда while. Пока я не могу сообразить в каких случаях выгоднее использовать while. Ведь можно спокойно использовать вместо него for(;условие; )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
17.10.2012, 10:56 #2
for использовать лучше тогда, когда есть необходимость в счётчике итераций или чём-то подобном. while для этих случаев описывается громоздко. С другой стороны, использовать for только для проверки условия не очень "красиво". Да и читается хуже гораздо. Одно дело прочитать "Пока не произошло событие...", а другое - какую-то слабо читаемую конструкцию. Один и тот же цикл можно описать через оба оператора (а в случае с for вообще без тела цикла можно обойтись), вопрос лишь в удобстве и читаемости.
1
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 10:58 #3
Цитата Сообщение от Fooly Посмотреть сообщение
Ведь можно спокойно использовать вместо него for(;условие; )?
Это некрасиво.
1
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.10.2012, 11:38 #4
если посмотреть на синтаксис этих циклов, то

C++
1
2
for(выражение1; выражение2; выражение3)
   тело цикла
и
C++
1
2
3
4
5
6
выражение1
while(выражение2)
{
   тело цикла
   выражение3
}
эквивалентны. но имеется масса задач, когда с while алгоритм получается красивее.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 11:53 #5
C++
1
2
3
4
5
6
выражение1
while(выражение2)
{
   тело цикла
   выражение3
}
Никаких выражений1-3 в описании синтаксиса (грамматики) этого цикла нет, собственно как и curly-braces.
А выглядит он примерно так:
while-loop ::: while ( conditional-expression ) statements
0
Catstail
Модератор
22613 / 10974 / 1778
Регистрация: 12.02.2012
Сообщений: 18,105
17.10.2012, 11:53 #6
Исконное предназначение for - арифметические циклы (циклы, число повторений которых известно); while - итерационные циклы (число повторений которых неизвестно). Именно это и позволяет организовать оба вида циклов "красиво" (как говорят ответившие выше), т.е. без лишних операторов в случае while и без ненужных точек с запятой в случае for.

Впрочем, все это содержит элемент субъективности. Главное - это правильность кода.
0
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,675
17.10.2012, 11:58 #7
Иногда неизвестно сколько потребуется повторений.
Примитивный пример: Выводить случайные значения пока не встретится определенное число
Цитата Сообщение от Fooly Посмотреть сообщение
Ведь можно спокойно использовать вместо него for(;условие; )?
for удобно когда известно конечное значение
while удобно когда конечное значение неизвестно, но известно условие выполнения цикла
0
Croessmah
Эксперт CЭксперт С++
13204 / 7475 / 839
Регистрация: 27.09.2012
Сообщений: 18,373
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 12:10 #8
а еще можно описать цикл с постусловием. Удобно при проверке введенных данных
C++
1
2
do{
}while(условие);
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 13:05 #9
for удобно когда известно конечное значение
while удобно когда конечное значение неизвестно, но известно условие выполнения цикла
C++
1
for ( Node* n = root; n != NULL; n = n->next )
"Конечное значение" не известно :-)
0
Croessmah
Эксперт CЭксперт С++
13204 / 7475 / 839
Регистрация: 27.09.2012
Сообщений: 18,373
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:10 #10
Цитата Сообщение от Герц Посмотреть сообщение
"Конечное значение" не известно :-)
Таким макаром можно всё об коленку =)))
C++
1
2
3
4
i=0;
while(i<n){
++i;
}
ИМХО, только путаница =)
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 13:12 #11
Можно еще сэкономить один инкремент, если точно известно, что цикл выполнится хотя бы раз:
C++
1
2
3
4
5
6
7
int i = 1;
while (true) {
    //...
    if (i >= n)
        break;
    i++;
}
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 13:13 #12
В случае с обходом таких структур (типа списка) мой вариант идеален :-)
0
Croessmah
Эксперт CЭксперт С++
13204 / 7475 / 839
Регистрация: 27.09.2012
Сообщений: 18,373
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:14 #13
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Можно еще сэкономить один инкремент, если точно известно, что цикл выполнится хотя бы раз:
Ну если уж об экономии, тогда ++i вместо i++ =)

Добавлено через 40 секунд
Цитата Сообщение от Герц Посмотреть сообщение
В случае с обходом таких структур (типа списка) мой вариант идеален :-)
C++
1
2
while(n=n->next){
}
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 13:14 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну если уж об экономии, тогда ++i вместо i++
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
0
Croessmah
Эксперт CЭксперт С++
13204 / 7475 / 839
Регистрация: 27.09.2012
Сообщений: 18,373
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:16 #15
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
Но надеяться на это я бы не стал.
0
Yandex
Объявления
17.10.2012, 13:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru