Почему для / while / do-while были помещены в c / c ++, когда они выполняют ту же задачу

0

Почему существует потребность в 3 разных циклах: "while", "do-while" и "for" для существования в c/c++, особенно когда каждый из них дает вам право делать почти все, что могут сделать другие 2 делать? На других языках не хватает одного или другого.

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

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

  • 1
    Большинство циклов также можно выполнить с помощью goto , почему бы не удалить все операторы цикла? По той же причине.
  • 1
    Что касается других языков, большинство языков, которые я знаю, имеют эти 3-х циклические структуры, даже больше, например, repeat .. until .
Показать ещё 7 комментариев
Теги:
loops

4 ответа

2
Лучший ответ

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

Если мы рассмотрим цикл for, это:

  • позволяет определять некоторые переменные - в собственной области цикла for - и инициализироваться,

  • тестирует контрольное выражение перед входом в цикл каждый раз (включая первый) и

  • имеет инструкцию, которая запускается после каждой итерации и перед повторным тестированием контрольного выражения, не предполагая, что break/return/throw/exit/failed assert и т.д. и независимо от того, выполняется ли последний оператор в теле или выполняется оператор continue; это утверждение традиционно зарезервировано для логического "продвижения" некоторого состояния "через" обработки, так что следующий тест контрольного выражения имеет смысл.

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

Если мы рассмотрим while цикл...

while (expression to test)
    ...

... он функционально точно эквивалентен...

for ( ; expression to test; )
    ...

... но это также подразумевает, что программист не имеет управляющих переменных, которые должны быть локальными для цикла, и что либо "выражение для проверки" по умолчанию "прогрессирует" через конечное число итераций, но и навсегда, если выражение тест зашиты true, или более сложное управление "прогресс" должен был спать сам контролируется и координируется заявлений в while элементы управления.

Другими словами, программист, видящий, в while как автоматически осознает, что им нужно более внимательно изучить контрольное выражение, затем, возможно, более широко рассмотрите как окружение/функцию, так и содержащиеся в ней утверждения, чтобы понять поведение цикла.

Итак, do - while? Ну, писать код, подобный этому, является болезненным и менее эффективным:

bool first_time = true;
while (first_time || ...)
{
    first_time = false;
    ...
}
// oops... first_time still hanging around...

...в сравнении с...

do
    ...
while (...);

Примеры

Пока цикл:

int i = 23;
while (i < 99)
{
    if (f(i)) { ++i; continue; }
    if (g(i)) break;
    ++i;
}
// oops... i is hanging around

Для цикла:

for (int i = 23; i < 99; ++i)
{
    if (f(i)) continue;
    if (g(i)) break;
}
0

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

for ( объекта for ( инициализация ; условие ; итерация-шаг )

Эта форма сообщает, как начнется цикл, как он будет корректировать вещи для следующей итерации, и каково условие оставаться внутри цикла. Эта конструкция само собой разумеется для выполнения N раз.

    for (int i = 0; i < N; ++i) {
        /* ... */
    }

while ( условие ) тело

Эта форма сообщает просто, что вы хотите продолжить выполнение цикла, пока условие остается истинным. Для циклов, в которых шаг итерации неяв к тому, как работает цикл, может быть более естественным способом сообщить намерение кода:

    while (std::cin >> word) {
        /* ... */
    }

do корпус в while ( состояние )

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

    if (count > 0) {
        do {
            /* ... */
        } while (--count > 0);
    } else {
        puts("nothing to do");
    }

Четвертое итерационное устройство - это... рекурсия!

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

struct node {
    struct node *next;
    char name[32];
    char info[256];
};

struct node * find (struct node *list, char *name)
{
    if (list == NULL || strcmp(name, list->name) == 0) {
        return list;
    }
    return find(list->next, name);
}
0

Некоторые циклы проще писать, используя for, некоторые из них проще писать, используя while, и некоторые из них проще писать, используя do - в while. Таким образом, язык предоставляет все три.

По той же причине у нас есть вещи, подобные оператору +=; += не делает ничего, что вы не можете сделать с помощью простого +, но его использование (в случае необходимости) может сделать ваш код более читабельным.

0

Ну, C++ имеет goto и вы можете использовать его для реализации всех трех циклов, но это не значит, что их нужно удалить. На самом деле это просто повышает удобочитаемость. Конечно, вы могли бы реализовать любого из них самостоятельно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню