Как сравнить 3 числа?

Имеется 3 числа:

unsigned int a;
unsigned int b;
unsigned int c;

Их значения задаются по ходу выполнения программы. А потом надо эти значения сравнить, чтобы найти наименьшее, а именно:

// сравниваем числа
if (smallest==a) {
...
} else if (smallest==b) {
...
} else if (smallest==c) {
...
}

Самое первое, что приходит в голову - связка if/else. Но даже с тремя числами такая связка будет весьма длинная, что не очень удобно. И что хуже - два из трёх чисел могут быть и равными, что неудобно, особенно если это будут два наименьших числа. Не подскажете, как коротко и грамотно оформить такое сравнение? Ещё лучше, если это обернуть в функцию вида

int num_match() {
   int smallest;
   ...
   return smallest;
}

Язык - C, не C++, так что плюсовые решения не предлагать... Также не предлагать Windows-овые функции (работаю под Linux).


Ответы (1 шт):

Автор решения: KoVadim

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

Я предлагаю объявить функцию вот так

int min3i(int a, int b, int c) {
  int smallest = a;
  smallest = smallest > b?:b:smallest;
  smallest = smallest > c?:c:smallest;
  return smallest;
}

хотя лучше уже написать так

int min3i(int a, int b, int c) {
  int smallest = a;
  if (b < smallest) { smallest = b;}
  if (c < smallest) { smallest = c;}
  return smallest;
}

и теперь можно использовать как int m = min3i(1,2,5);. Почему я добавил 3i в название? это си, тут нельзя иметь функции с разным кол-вом параметров и одним именем.

Если же хочется макросов (ну потому что сравниваются не только int, а и float и другое, то вот такой способ (улучшим идею от @Harry)

#define min(a,b) ((a)>(b))?(b):(a)
#define min3(a,b,c) min((a), min((b), (c)))

Скобки нужны, так как иначе могут быть чудеса, к примеру, с таким выражением min3(a+b, b+c, 3) (надеюсь, я их достаточно поставил).

→ Ссылка