Для против в то время как в программировании на C? - PullRequest
71 голосов
/ 01 июня 2010

В C есть три цикла: for, while и do-while. В чем разница между ними?

Например, кажется, что почти все операторы while можно заменить на операторы for, верно? Тогда в чем преимущество использования while?

Ответы [ 19 ]

2 голосов
/ 01 июня 2010

Они практически одинаковы, за исключением цикла do-while. Цикл for хорош, когда у вас есть переменная counter. Это делает это очевидным. Цикл while имеет смысл в случаях, когда флаг проверяется, как показано ниже:

while (!done) {
   if (some condtion) 
      done = true;
}
2 голосов
/ 01 июня 2010

WHILE более гибок. FOR более лаконичен в тех случаях, когда он применяется.

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

for (int n=0; n<max; ++n)

Конечно, вы можете выполнить то же самое с WHILE, как уже указывали другие, но теперь инициализация, тест и приращение разбиты на три строки. Возможно три широко разделенные линии, если тело цикла большое. Это затрудняет читателю видеть, что вы делаете. В конце концов, хотя "++ n" является очень распространенным третьим элементом FOR, это, конечно, не единственная возможность. Я написал много циклов, где я пишу «n + = increment» или более сложное выражение.

FOR может также хорошо работать с вещами, отличными от счетчика, конечно. Как

for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())

1011 * Etc. *

Но FOR ломается, когда логика «в следующий раз через цикл» усложняется. Рассмотрим:

initializeList();
while (listHasMoreElements())
{
  n=getCurrentElement();
  int status=processElement(n);
  if (status>0)
  {
    skipElements(status);
    advanceElementPointer();
  }
  else
  {
    n=-status;
    findElement(n);
  }
}

То есть, если процесс продвижения может отличаться в зависимости от условий, возникающих при обработке, оператор FOR нецелесообразен. Да, иногда вы можете заставить его работать с достаточно сложными выражениями, использовать троичный оператор?: И т. Д., Но это обычно делает код менее читабельным, а не более читабельным.

На практике большинство моих циклов либо проходят через массив, либо какую-то структуру, в этом случае я использую цикл FOR; или читаем файл или набор результатов из базы данных, и в этом случае я использую цикл WHILE («while (! eof ())» или что-то в этом роде).

2 голосов
/ 01 июня 2010

Между и во время: while не нуждается ни в инициализации, ни в операторе обновления, поэтому может выглядеть лучше, более элегантно; В for могут отсутствовать операторы, один, два или все, поэтому наиболее гибким и очевидным является необходимость инициализации, условия цикла и «обновления» перед циклом. Если вам нужно только условие цикла (проверено в начале цикла), тогда while более элегантно.

Между for / while и do-while : в do-while условие оценивается в конце цикла. Более удобно, если цикл должен быть выполнен хотя бы один раз.

2 голосов
/ 01 июня 2010

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

Циклы do while полезны, когда условие зависит от некоторых входов. Они являются наиболее редко используемыми из трех типов петель.

2 голосов
/ 01 июня 2010

Разница между while и do-while заключается в том, что while проверяет условие цикла и, если оно истинно, выполняется тело и условие проверяется снова. Do-while проверяет условие после выполнения тела, так что с do-while тело выполняется как минимум один раз.

Конечно, вы можете написать цикл while как do-while и vv, но для этого обычно требуется некоторое дублирование кода.

2 голосов
/ 01 июня 2010

Они все одинаковы в своей работе. Вы можете сделать то же самое, используя любой из них. Но для удобочитаемости, удобства использования, удобства и т. Д. Они отличаются.

2 голосов
/ 01 июня 2010

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

Одно объяснение среди других

0 голосов
/ 06 июля 2017

/ * цикл while

5 баксов

1 шоколад = 1 баксов

while my money is greater than 1 bucks 
  select chocolate
  pay 1 bucks to the shopkeeper
  money = money - 1
end

пришел домой и не могу пойти в магазин, потому что мои деньги = 0 баксов * /

#include<stdio.h>
int main(){
  int money = 5;

  while( money >= 1){   
    printf("inside the shopk and selecting chocolate\n");
    printf("after selecting chocolate paying 1 bucks\n");
    money = money - 1 ;  
    printf("my remaining moeny = %d\n", money);
    printf("\n\n");
  }

  printf("dont have money cant go inside the shop, money = %d",  money);

  return 0;
} 

бесконечные деньги

while( codition ){ // condition will always true ....infinite loop
  statement(s)
}

пожалуйста, посетите это видео для лучшего понимания https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s

/ * для цикла

5 баксов

for my money is greater than equal to 1 bucks   0      money >= 1
  select chocolate
  pay 1 bucks to the shopkeeper
  money = money - 1  1-1 => 0
end

* /

#include<stdio.h>
int main(){

  int money = 5;
  for( ; money >= 1; ){     0>=1  false 
    printf("select chocolate \n");
    printf("paying 1 bucks to the shopkeeper\n");
    money = money - 1;    1-1 = 0
    printf(" remaining money =%d\n", money);
    printf("\n\n");
  }

  return 0;
}

Для лучшего понимания, пожалуйста, посетите https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s

0 голосов
/ 11 августа 2012
Операторы

while и for могут использоваться для циклического программирования. От программиста зависит, будет ли использоваться цикл while или for. Некоторым удобно использовать петлю while, а другим - петлю for.

Используйте любой цикл, который вам нравится. Однако цикл do...while может быть несколько сложным в программировании на C .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...