Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Fooly
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
#1

for и while - C++

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

Объясните плз, когда следует использовать for, а когда while. Пока я не могу сообразить в каких случаях выгоднее использовать while. Ведь можно спокойно использовать вместо него for(;условие; )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
17.10.2012, 10:56 #2
for использовать лучше тогда, когда есть необходимость в счётчике итераций или чём-то подобном. while для этих случаев описывается громоздко. С другой стороны, использовать for только для проверки условия не очень "красиво". Да и читается хуже гораздо. Одно дело прочитать "Пока не произошло событие...", а другое - какую-то слабо читаемую конструкцию. Один и тот же цикл можно описать через оба оператора (а в случае с for вообще без тела цикла можно обойтись), вопрос лишь в удобстве и читаемости.
1
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 10:58 #3
Цитата Сообщение от Fooly Посмотреть сообщение
Ведь можно спокойно использовать вместо него for(;условие; )?
Это некрасиво.
1
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 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 / 12
Регистрация: 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
Модератор
23539 / 11649 / 2036
Регистрация: 12.02.2012
Сообщений: 18,985
17.10.2012, 11:53 #6
Исконное предназначение for - арифметические циклы (циклы, число повторений которых известно); while - итерационные циклы (число повторений которых неизвестно). Именно это и позволяет организовать оба вида циклов "красиво" (как говорят ответившие выше), т.е. без лишних операторов в случае while и без ненужных точек с запятой в случае for.

Впрочем, все это содержит элемент субъективности. Главное - это правильность кода.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
17.10.2012, 11:58 #7
Иногда неизвестно сколько потребуется повторений.
Примитивный пример: Выводить случайные значения пока не встретится определенное число
Цитата Сообщение от Fooly Посмотреть сообщение
Ведь можно спокойно использовать вместо него for(;условие; )?
for удобно когда известно конечное значение
while удобно когда конечное значение неизвестно, но известно условие выполнения цикла
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 12:10 #8
а еще можно описать цикл с постусловием. Удобно при проверке введенных данных
C++
1
2
do{
}while(условие);
0
Герц
524 / 341 / 12
Регистрация: 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
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:10 #10
Цитата Сообщение от Герц Посмотреть сообщение
"Конечное значение" не известно :-)
Таким макаром можно всё об коленку =)))
C++
1
2
3
4
i=0;
while(i<n){
++i;
}
ИМХО, только путаница =)
0
Кот Ангенс
318 / 268 / 128
Регистрация: 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 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 13:13 #12
В случае с обходом таких структур (типа списка) мой вариант идеален :-)
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:14 #13
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Можно еще сэкономить один инкремент, если точно известно, что цикл выполнится хотя бы раз:
Ну если уж об экономии, тогда ++i вместо i++ =)

Добавлено через 40 секунд
Цитата Сообщение от Герц Посмотреть сообщение
В случае с обходом таких структур (типа списка) мой вариант идеален :-)
C++
1
2
while(n=n->next){
}
0
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 13:14 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну если уж об экономии, тогда ++i вместо i++
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:16 #15
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
Но надеяться на это я бы не стал.
0
Герц
524 / 341 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 13:20 #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну если уж об экономии, тогда ++i вместо i++ =)

Добавлено через 40 секунд

C++
1
2
while(n=n->next){
}
Объявления и присваивания n не хватает, не находишь?
0
Catstail
Модератор
23539 / 11649 / 2036
Регистрация: 12.02.2012
Сообщений: 18,985
17.10.2012, 13:21 #17
Ох... Ну почему ничтожные по сути вопросы вызывают такое бурное обсуждение?
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 13:21 #18
Цитата Сообщение от Герц Посмотреть сообщение
Объявления и присваивания n не хватает, не находишь?
А в твоем примере даже функции main нет =)))
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.10.2012, 14:42 #19
Цитата Сообщение от Герц Посмотреть сообщение
Никаких выражений1-3 в описании синтаксиса (грамматики) этого цикла нет
почитайте Курниган, Ритчи "Язык программирования С" тему "циклы - while и for", где именно такой синтаксис приводится, да и поинтересуйтесь для начала что вкладывается в значение слова "выражение", ну а потом повторите свою фразу еще раз для пущей убедительности
0
Catstail
Модератор
23539 / 11649 / 2036
Регистрация: 12.02.2012
Сообщений: 18,985
17.10.2012, 14:51 #20
Цитата Сообщение от Thinker Посмотреть сообщение
Курниган
- понимаю, что описка...
1
17.10.2012, 14:51
Ответ Создать тему
Опции темы

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