Pull to refresh

Comments 9

Позволяет, конечно, только в форме default: assert(0);
так и было сделано, но было интересно попробовать по другому.
default: assert(0) в вашем случае будет ошибочным, потому что по enNone ничего делать не надо, ибо это не ошибка.

достаточно просто default:

Так оно до assert(0) и не дойдёт никогда, поэтому ошибка никогда не сгенерируется, но да, писать так всё равно не нужно.
=) почему не нужно — нужно, если предполагается, что enNone невалидное значение.

Судя же по первому варианту кода — enNone вполне валидное значение, но по нему ничего не должно происходить — вот и не надо assert(0) ставить.

У меня в конечном итоге получился следующий вариант:
    if(enNone!=Enum)
      {
        switch(Enum)
          {
            case enOne:
                 Value=f1(Value);
                 break;/*enOne*/
            case enTwo:
                 Value=f2(Value);
                 break;/*enTwo*/
            case enThree:
                 Value=f3(Value);
                 break;/*enThree*/
            default:assert( 0 );
                 break;
          }/*SWITCH*/
        Value=A*Value+B;
      }/*THEN*/


default конечно, никогда не выполнится, вплоть до последующего изменения типа, но тогда assert отловит эту ситуацию при тестах.
Именно поэтому он там необходим.
Да не, я имел ввиду, что часть default в таком коде никогда не выполнится — выше цикл по условию "!=enNone", а остальные значения «отловятся» выше в ветках switch-case. Потому и не важно что там стоит. Но ниже, кстати, автор прав — если в будущем возможно расширение перечисления, то assert вроде как и к месту вполне, тут я соглашусь всё же.
Устройство Даффа — это метод оптимизации циклов. У Вас тут не цикл, а обычное ветвление, так что метка не совсем в тему.
В устройстве Даффа также используется особенность определения оператора switch, потому и упомянул.
Sign up to leave a comment.

Articles