...
У меня нет возможности инструментально всё это выполнить-проверить, но даже такие ныне старые, как 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;
  }
}