Подтвердить что ты не робот

Перерыв в случае с возвратом.. и по умолчанию

My OCD заставляет меня добавлять "break" при написании операторов case, даже если они не будут выполнены. Рассмотрим следующий пример кода:

switch(option) {
    case 1:
        a = 1;
        b = 7;
        break;
    case 2:
        a = 2;
        b = 4;
        return (-1);
        break;
    default:
        a = -1;
        break;
}

Мои два вопроса:
Для "случая 2:" мне действительно не нужен перерыв, но хорошо ли это иметь там? Для "default:". Это чисто OCD, или есть ли настоящая причина иметь здесь разрыв?

4b9b3361

Ответ 1

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

Ответ 2

Я согласен с перерывом в последнем случае по умолчанию и не согласен с перерывами после возврата. (Коллега делает это, и это болит мои глаза.)

Я также отступаю, чтобы уменьшить распространение уровней отступа.:) i.e.:

switch(option) {
case 1:
    a = 1;
    b = 7;
    break;
case 2:
    a = 2;
    b = 4;
    return -1;
default:
    a = -1;
    break;
}

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

Ответ 3

Разрыв после вашего случая по умолчанию - это только вопрос личных предпочтений.

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

Ответ 4

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

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

Ответ 5

Я предпочитаю всегда иметь перерыв в каждом случае, включая значение по умолчанию, и избегать возврата во всех внутренних переключателях. Для коротких переключателей с 2-3 случаями (включая по умолчанию) возврат в порядке, но только в том случае, если все случаи делают это одинаково. "бессмысленный" перерыв, я вижу бессмысленным и только делаю его более читаемым. То же самое касается пустых значений по умолчанию, которые просто ломаются, совершенно бессмысленно. Легкость чтения кода на мой взгляд важнее того, что произойдет, если кто-то изменит то или иное.

Ответ 6

Ни один из них не делает ничего для вас, но и не наносит вреда.

Лично я обычно оставляю их, если у меня есть возврат, но я также стараюсь избегать множественных точек возврата в функции, если это возможно.

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

Ответ 7

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

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

    switch(foo){
         case 0:
             baz = 1;
             break;
         case 1:
             bar %= 2;
             return -1;
             /* NOTREACHED */
         case 2:
             bar = -1;
             return -2;
             /* NOTREACHED */
             break;
         default:
             break;
    }

Между случаями 1 и 2 я предпочитаю 2. Несмотря на то, что комментарий говорит NOTREACHED, комментарии могут лежать (непреднамеренно, конечно), когда код изменяется. Мне нравится комментарий NOTREACHED, так как он может удовлетворить, что вы знаете, что делаете, и служит напоминанием о том, что вы выходите из функции раньше. Причиной того, что размещение прерывания после возвращения будет уменьшать ошибки, если возврат удаляется, кажется мне неправильным. Вы по-прежнему будете получать фиктивное поведение, независимо от того, попадете ли вы в следующий случай или вы выйдете из коммутатора и продолжаете работу по-прежнему.

Конечно, если я смогу этого избежать, я не вернусь от функции внутри тела коммутатора.

Ответ 8

Мне говорят, что в C, С++, java и С#, если вы не поместите эти "перерывы", поток кода программы попадет в другие "случаи" и будет выполнять инструкции внутри них, неважно, переменная не имеет значений, назначенных "случаям".

Ответ 9

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

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

Ответ 10

Я лично не помещаю перерывы, но это может помочь, когда кто-то решает переместить возврат (-1) на внешний ключ и забывает добавить разрыв.

Ответ 11

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

Ответ 12

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

Ответ 13

Пожалуйста, извините мои ограниченные знания, но что такое OCD?
Кроме того, Брайан Керниган предоставляет хорошее объяснение, когда вы должны (не) использовать break в инструкции switch.