...
У меня нет возможности инструментально всё это выполнить-проверить, но даже такие ныне старые, как VC5 и VC6 (по моим воспоминаниям), справлялись со всем. У меня в проектах даже специально ассемблерные листинги были включены в проект и я это всегда смотрел-сравнивал (и Randall Hyde Great Debate и подобное читал).
1) Для бОльшей наглядности сложения можно заменить на
|.
===
Это не имеет значения, всё это вместе с умножениями оптимизируется. Плюс считаю естественнее (в статье Википедии "Позиционная система счисления" стоит сумма). Кстати, с плюсом компилятору будет легче выяснить, всё ли есть в switch.
2) Статический анализатор может обругать такой код, сказав, что не все пути имеют return. Чтобы его удовлетворить, можно добавить поле default или воткнуть return за switch-ем.
===
Он должен (сколь помню) разобраться, что там всё перечислено. У вас есть возможность если, посмотрите с разными оптимизациями.
3) Нулевое возвращаемое значение является вполне корректным для данной функции - не очень красиво писать его в return без какой-либо дополнительной обработки, даже если программа туда никогда не зайдет. Кстати, а зачем выписывать варианты, которые не могут случиться?
===
И для красоты-симметрии и для помощи анализатору (2) и для "ровности" кода -- посмотрите в асме, что выходит при разных изменениях.
Если б мог, я бы всё это и сам посмотрел -- интересно же.
Онлайн-компиляторы асм выдают? Надо бы посмотреть, но с планшета это сложновато (и JS выключен почти всегда у меня).
-- 14.01.2019, 17:02 --int mid( int a, int b, int c )
{
switch( (a<b)*4 + (b<c)*2 + (a<c)*1 )
{
case 0: return b; // 000: a>b, b>c, a>c
case 1: return 0; // 001: a>b, b>c, a<c: cannot be
case 2: return c; // 010: a>b, b<c, a>c
case 3: return a; // 011: a>b, b<c, a<c
case 4: return a; // 100: a<b, b>c, a>c
case 5: return c; // 101: a<b, b>c, a<c
case 6: return 0; // 110: a<b, b<c, a>c: cannot be
case 7: return b; // 111: a<b, b<c, a<c
}
}
...симметрично относительно центральной горизонтали (между 3 и 4).
Можно воспользоваться этой симметричностью:
int mid( int a, int b, int c )
{
switch( ((b<c)^(a<b))*2 + ((a<c)^(a<b))*1 )
{
case 0: return b;
case 1: return 0;
case 2: return c;
case 3: return a;
}
}
-- 14.01.2019, 17:20 --Дальше можно воспользоваться и тем, что один результат не используется (схлопываем "0" и "c"):
int mid( int a, int b, int c )
{
switch( ((b<c)^(a<b)) + ((a<c)^(a<b)) )
{
case 0: return b;
case 1: return c;
case 2: return a;
}
}