Достоверность заявления о перерыве - PullRequest
2 голосов
/ 16 июля 2011

Я недавно прочитал в книге, что, например, используется выражение break, например, Циклы for считаются неэлегансными (хотя они широко используются в выражении switch).

В чем причина этого "обвинения"?

Стоит ли использовать оператор break в цикле for или несколько условий?

Ответы [ 5 ]

7 голосов
/ 16 июля 2011

Вам нужно будет спросить автора книги ( какая книга?), Так как мой ESP сегодня на взводе [необходима цитата] .

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

Но, на самом деле, пара break операторов внутри условных блоков никому не повредит, а усложнение условных циклов, IMO, болеенемедленно склонен к , идущему ужасно неправильно .

1 голос
/ 16 июля 2011

Это похоже на тех, кто говорит goto плохо из-за статьи, написанной Джикстра на эту тему в 60-х годах.При свободном использовании я бы согласился.Но, например, в C-функции, которая не имеет преимущества обработки исключений в C ++ с использованием try и catch, преднамеренное и преднамеренное использование goto может быть очень полезным при создании автономной очистки-up раздел в случае возврата ошибки для функции, которая выделяет память, используя malloc().Без оператора goto вам пришлось бы размещать код очистки в конце каждого оператора if, который обнаружил ошибку.Например, что выглядит лучше для вас ... это:

int my_func()
{
    int* a = malloc(10);

    //... some code
    if (some_error)
    {
        free(a);
        return -1;
    }

    //... more code

    if (some_other_error)
    {
        free(a);
        return -1;
    }

    //... more code

    if (another_error)
    {
        free(a);
        return -1;
    }

    //... more code

    free(a);
    return 0;
}

или код, который выглядит следующим образом:

void my_func()
{
    int* a = malloc(10);

    //... some code

    if (some_error)
        goto return_error;

    //... more code

    if (some_other_error)
        goto return_error;

    //... more code

    if (another_error)
        goto return_error;

    //... more code

    normal_return:
        free(a);
        return 0;

    return_error:
        free(a);
        return -1;
}

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

1 голос
/ 16 июля 2011

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

0 голосов
/ 17 июля 2011

Я не уверен, поможет ли это, но Хоакин М Лопес Муньос задал этот вопрос в своем блоге: http://bannalia.blogspot.com/2009/03/about-break-statements.html

С уважением, & rzej

0 голосов
/ 16 июля 2011

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

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

...