Используя продолжаются в операторе переключения

Я хочу спрыгнуть с середины a switch оператор, к инструкции циклов в следующем коде:

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        break;
    default:
        // get another something and try again
        continue;
    }
    // do something for a handled something
    do_something();
}

Это допустимый способ использовать continue? continue операторы, проигнорированные switch операторы? C и C++ расходятся в своем поведении здесь?

74
задан Matt Joiner 10 July 2011 в 11:33
поделиться

4 ответа

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

while (something = get_something()) {
    if (something == A || something == B)
        do_something();
}

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

Например:

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();
51
ответ дан 24 November 2019 в 12:03
поделиться

Да, все в порядке - это просто нравится использовать его в , если утверждение. Конечно, вы не можете использовать разрыв , чтобы вырваться из петли изнутри переключателя.

20
ответ дан 24 November 2019 в 12:03
поделиться

В то время как технически действительны, все эти прыжки неясных контрольных потоков - особенно , продолжайте оператор .

Я бы использовал такой трюк как крайний курорт, не первый.

Как насчет

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        do_something();
    }        
}

это короче и выполняет свои вещи более четкими способом.

5
ответ дан 24 November 2019 в 12:03
поделиться

Позвольте им попробовать его через удаленный рабочий стол или VNC.

-121--4716464-

Краткий ответ: используйте любой механизм, который предоставляют библиотеки подключений, он действительно не имеет никакого отношения к базе данных. Если вы используете ADO, у вас есть параметризованные запросы, если вы используете что-то другое (я ничего не знаю о PHP), то используйте все, что предлагает эта библиотека.

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

-121--1918177-

Синтаксически правильно и стилистически нормально.

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

 break;
 continue;
 return (x);
 exit (x);
 throw (x);
 //fallthrough

Кроме того, допускается следующий случай (x): немедленно с

 case (y):
 default:

- объединение нескольких случаев, которые имеют точно такой же эффект.

Все остальное считается ошибкой, как и , если (a = 4) {...} Конечно, необходимо замкнуть петлю ( пока , для , сделать... пока ) для продолжить работу. Он не будет закольцовываться только в case () . Но конструкция типа:

while(record = getNewRecord())
{
    switch(record.type)
    {
        case RECORD_TYPE_...;
            ...
        break;
        default: //unknown type
            continue; //skip processing this record altogether.
    }
    //...more processing...
}

... это нормально.

7
ответ дан 24 November 2019 в 12:03
поделиться