Является ли цикл For просто простым способом использования цикла While с одной переменной count?

Вы наверное перепутали тему. Итак, позвольте мне объяснить это.

В большинстве компьютерных языков у нас есть циклы for и while. Но в моем примере я объявлю цикл на С#.

Когда вы декалируете цикл for и цикл while, как это.

1.Для петли

 for(i=0;i<10;i++)
   {
     //do something
   }

2. Во время цикла

 int i=0;
 while(i<10)
   {
     //do something
     i++;
   }

Из 2 петель. Когда дело доходит до компилятора, они выполняют одни и те же вещи? (кроме int i, который был объявлен вне цикла while.) Если нет, какой из них лучше или эффективнее?

заранее спасибо


person Poomrokc The 3years    schedule 30.04.2014    source источник
comment
Я не знаю. Является ли цикл while простым способом использования goto?   -  person Jeremy West    schedule 30.04.2014
comment
На это невозможно ответить в общем, потому что единственными теоретически надежными данными были бы тесты компиляторов (и их опций) один за другим. Но на практике будет то же самое.   -  person Jon    schedule 30.04.2014
comment
Вы можете проверить, что они компилируют, используя ildasm. Обратите внимание, что если у вас есть continue в любом месте тела цикла, разница становится значительной.   -  person Jon Skeet    schedule 30.04.2014
comment
4 года назад это считалось хорошим вопросом.   -  person usr    schedule 30.04.2014
comment
@usr извините, я не нашел этот вопрос, позвольте мне удалить его.   -  person Poomrokc The 3years    schedule 30.04.2014
comment
Я спросил, будут ли они соблюдать то же самое, не только в отношении их выступления. Это не дубликат, ребята...   -  person Poomrokc The 3years    schedule 30.04.2014


Ответы (2)


Простой ответ на ваш вопрос: «Да, они будут компилироваться в один и тот же код». Иногда. Это будет зависеть от языка и от компилятора. Что касается C#, то любая разница в сгенерированном коде будет настолько мала, что не будет иметь значения с точки зрения времени выполнения.

Любую петлю for можно перекодировать как while и наоборот. Например, этот цикл while:

bool done = false;
while (!done)
{
    // do stuff
}

Может быть перекодирован как for:

for (bool done = false; !done;)
{
    // do stuff
}

for и while — это просто абстракции. Иногда нам проще представить себе пошаговый просмотр списка, который является основой (хотя, конечно, не единственным применением) оператора for. В других случаях мы хотим что-то сделать, пока какое-то условие остается истинным, поэтому мы используем while. А в некоторых языках есть until (или, в C, do ... while), который ставит условие в конец.

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

person Jim Mischel    schedule 30.04.2014

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

С точки зрения производительности разницы нет. Кроме того, если вы пострадаете от влияния на производительность на таком низком уровне, вы исключите любую другую серьезную проблему с производительностью, что, в свою очередь, даст представление о том, как здесь работает IL.

person Samuel    schedule 30.04.2014