2013-02-18 3 views
7

Много раз в примерах программ на С, я сталкивался с этими типами петель. Что действительно делают эти петли?Простой цикл while while (true);

do { 

    while (...) // Check some condition if it is true. 
    { 
     calculation 1 
    } 

    // Some new condition is checked. 

} while(true); 

Какова потребность while(true); ли она для бесконечного зацикливания? Может кто-нибудь объяснить, что делает этот цикл. Я новичок в программировании C

+3

Я никогда не видел 'do while (true)'. Это бесконечный цикл, но идиоматический (и понятный) способ написать один, если 'for (;;)'. –

ответ

1

да она используется для бесконечного зацикливания, в этом случае лучше практика, чтобы вырваться из взгляда на состояние

do { 

    while() //check some condition if it is true 
    { 
    calculation 1 
    } 

    //some new condition is checked,if condition met then break out of loop 


    } while(true); 
0

В C все петли петли в то время как условие истинно. Таким образом, явное выражение true в условии действительно означает «цикл, в то время как true истинно», и поэтому он навсегда.

+1

В 'for (;;)' где или что такое условие? :-) – Jens

+0

@Jens Я имею доступ только к спецификации C++ 11, но он говорит, что цикл 'for' эквивалентен циклу' while', а §2 раздела 6.5.3 говорит: «Отсутствие условия делает подразумеваемый термин 'while', эквивалентный' while (true) '" –

+1

@Jens В 6.8.5.3 (2): «Пропущенное выражение _expression-2_ заменено ненулевой константой », где _expression-2_ является условием цикла. Таким образом, условие неявно вставлено, если вы не пишете одно (но, конечно же, под правилом as-if вы часто получаете безусловный переход). –

0

Этот цикл бесконечен, и если вы хотите, чтобы ваша программа когда-либо заканчивалась с таким ловом, вам необходимо либо выполнить оператор break, либо return (или в некоторых случаях выдать исключение) в заданном состоянии в таком цикле, иначе такая программа будет никогда не заканчиваются.

+0

Или используйте 'goto' ... –

0

Бесконечный цикл полезен, если проверка стоп-условие не может ни быть сделано перед (как с for и while), ни на спине (как с do{}while). Вместо этого вы просто зацикливаетесь навсегда, а в середине кода вы можете проверить состояние и разбить: if(something) break;.

0

иногда мы используем его, например:

do 
    recv(s , &buf, len, flags); 
while(true) 

пример из Winsock Windows API, таким путем вы можете слушать из порта.

0
do { 
    // code here 
} while(true); 

Этот цикл работает бесконечно, и это может привести к задержке выполнения, если не остановить. Если вы выполняете эти виды циклов, убедитесь, что у вас есть оператор break внутри, чтобы убедиться, что ваш цикл остановится в какой-то момент.

Подобно этому

if(condition) 
    break; 

Если ваша программа достигла какой-то момент, когда условие истинно, оно будет автоматически закончить делать-то время как цикл и перейти к коду после этого.

0

Общий дифференцирующим фактором между следующими петлями:

while (condition) {action} 
do {action} while (condition) 

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

Иными словами, условие для while проверяется в начале цикла, а для do while оно проверяется в конце.

Часто вы увидите код, где разработчики, кажется, не знают о do-while в том, что они пишут:

result = doSomething(); 
while (result == NOT_FINISHED) { 
    result = doSomething(); 
} 

, которые можно было бы лучше записать в виде:

do { 
    result = doSomething(); 
} while (result == NOT_FINISHED); 

Однако в вашем конкретном случае, когда условие всегда true, это не имеет большого значения. Следующие циклы основном эквивалентны (с использованием 1 для истинного случая):

for (;;) { doSomething(); } 
for (;;doSomething()); 

while (1) { doSomething(); } 
do { doSomething(); } while (1); 

while (doSomething(),1); 

BADPAX: doSomething(); goto BADPAX; 

Первый for цикл, вероятно, канонический способ сделать бесконечный цикл, пользуясь тем, что, если опустить условие продолжения для цикла он предполагает, что это всегда верно.

Второй цикл for просто перемещает тело петли в часть итерации for.

Первый while также иногда встречается в дикой природе, do-while, вероятно, меньше. Единственное отличие здесь состоит в том, что первые петли навсегда проверяют вершину петли, последние петли навсегда проверяют на дне петли.

Окончательный while цикла с помощью оператора запятая C таким образом, вы, вероятно, никогда не следует :-)

Это последнее очень редко в наше время, но, вероятно, что все они оптимизируют вниз на уровне машинного кода.

3

Эти петли используются, когда вы хотите зацикливаться навсегда, и условие выхода из цикла неизвестно. Условия Certiain устанавливаются внутри петли вместе с перерывом или return Выписки из цикла. Например:

while(true){ 
    //run this code 
    if(condition satisfies) 
     break; //return; 
} 

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

Смежные вопросы