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

for и while - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
17.10.2012, 10:47     for и while #1
Объясните плз, когда следует использовать for, а когда while. Пока я не могу сообразить в каких случаях выгоднее использовать while. Ведь можно спокойно использовать вместо него for(;условие; )?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
17.10.2012, 10:56     for и while #2
for использовать лучше тогда, когда есть необходимость в счётчике итераций или чём-то подобном. while для этих случаев описывается громоздко. С другой стороны, использовать for только для проверки условия не очень "красиво". Да и читается хуже гораздо. Одно дело прочитать "Пока не произошло событие...", а другое - какую-то слабо читаемую конструкцию. Один и тот же цикл можно описать через оба оператора (а в случае с for вообще без тела цикла можно обойтись), вопрос лишь в удобстве и читаемости.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 10:58     for и while #3
Цитата Сообщение от Fooly Посмотреть сообщение
Ведь можно спокойно использовать вместо него for(;условие; )?
Это некрасиво.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.10.2012, 11:38     for и while #4
если посмотреть на синтаксис этих циклов, то

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

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

Добавлено через 40 секунд
Цитата Сообщение от Герц Посмотреть сообщение
В случае с обходом таких структур (типа списка) мой вариант идеален :-)
C++
1
2
while(n=n->next){
}
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
17.10.2012, 13:14     for и while #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну если уж об экономии, тогда ++i вместо i++
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
17.10.2012, 13:16     for и while #15
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
По идее, оптимизатор должен заменять постфиксную запись на префиксную вне выражений.
Но надеяться на это я бы не стал.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.10.2012, 13:20     for и while #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну если уж об экономии, тогда ++i вместо i++ =)

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

C++
1
2
while(n=n->next){
}
Объявления и присваивания n не хватает, не находишь?
Catstail
Модератор
 Аватар для Catstail
21492 / 10245 / 1670
Регистрация: 12.02.2012
Сообщений: 17,129
17.10.2012, 13:21     for и while #17
Ох... Ну почему ничтожные по сути вопросы вызывают такое бурное обсуждение?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
17.10.2012, 13:21     for и while #18
Цитата Сообщение от Герц Посмотреть сообщение
Объявления и присваивания n не хватает, не находишь?
А в твоем примере даже функции main нет =)))
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.10.2012, 14:42     for и while #19
Цитата Сообщение от Герц Посмотреть сообщение
Никаких выражений1-3 в описании синтаксиса (грамматики) этого цикла нет
почитайте Курниган, Ритчи "Язык программирования С" тему "циклы - while и for", где именно такой синтаксис приводится, да и поинтересуйтесь для начала что вкладывается в значение слова "выражение", ну а потом повторите свою фразу еще раз для пущей убедительности
Catstail
Модератор
 Аватар для Catstail
21492 / 10245 / 1670
Регистрация: 12.02.2012
Сообщений: 17,129
17.10.2012, 14:51     for и while #20
Цитата Сообщение от Thinker Посмотреть сообщение
Курниган
- понимаю, что описка...
Yandex
Объявления
17.10.2012, 14:51     for и while
Ответ Создать тему
Опции темы

Текущее время: 00:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru