Был у меня простой, рабочий код (я убрал лишнее оставил только суть):
Больших претензий к нему у меня не было, но решил его микрооптимизировать:
Решил устранить избыточность и вынести отдельно общее преобразование.
Получилось так:
Всё замечательно: код стал компактней, правильность кода не ухудшилась, но компилятор стал выдавать предупреждение, что в операторе switch одна из констант перечисления не обрабатывается.
Я стараюсь программировать так, чтобы не было warning'ов, потому задумался, а что здесь можно сделать, и вспомнив устройство Даффа, сделал так:
Предупреждение пропало, но код получился не поддерживаемым, поэтому, в последний раз полюбовавшись, откатился к первоначальному варианту.
Этот код работает только потому, что в языке Си для оператора switch ограничения на составной оператор ослаблены настолько, что требуется только чтобы он был правильно составлен и метки case: стояли перед операторами.
Только первый оператор break; выходит из конструкции switch, остальные выходят из цикла do {} while.
Ещё я знаю, что такую особенность switch используют для организации сопроцессов в Си, но, к сожалению, пример такого полезного применения этой особенности не удалось найти.
typedef enum
{
enNone,
enOne,
enTwo,
enThree
}TEnum;
switch(Enum)
{
case enNone:
/*Ничего не делаем*/
break;/*enNone*/
case enOne:
Value=f1(Value);
Value=A*Value+B;
break;/*enOne*/
case enTwo:
Value=f2(Value);
Value=A*Value+B;
break;/*enTwo*/
case enThree:
Value=f3(Value);
Value=A*Value+B;
break;/*enThree*/
}/*SWITCH*/
Больших претензий к нему у меня не было, но решил его микрооптимизировать:
Решил устранить избыточность и вынести отдельно общее преобразование.
Получилось так:
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*/
}/*SWITCH*/
Value=A*Value+B;
}/*THEN*/
Всё замечательно: код стал компактней, правильность кода не ухудшилась, но компилятор стал выдавать предупреждение, что в операторе switch одна из констант перечисления не обрабатывается.
Я стараюсь программировать так, чтобы не было warning'ов, потому задумался, а что здесь можно сделать, и вспомнив устройство Даффа, сделал так:
switch(Enum)
{
case enNone: break;
do
{
case enOne:
Value=f1(Value);
break;/*enOne*/
case enTwo:
Value=f2(Value);
break;/*enTwo*/
case enThree:
Value=f3(Value);
break;/*enThree*/
}while( 0 );
Value=A*Value+B;
}/*SWITCH*/
Предупреждение пропало, но код получился не поддерживаемым, поэтому, в последний раз полюбовавшись, откатился к первоначальному варианту.
Этот код работает только потому, что в языке Си для оператора switch ограничения на составной оператор ослаблены настолько, что требуется только чтобы он был правильно составлен и метки case: стояли перед операторами.
Только первый оператор break; выходит из конструкции switch, остальные выходят из цикла do {} while.
Ещё я знаю, что такую особенность switch используют для организации сопроцессов в Си, но, к сожалению, пример такого полезного применения этой особенности не удалось найти.