Siddhant Kumar is not correct; BOTH switch and a large if() else if() scan the values one by one to find the right path. (There isn't a binary tree or anything else implemented in ANSI C to do this more effectively)
If you are building on a Pentium, or advanced processor with predictive path analysis or similar technology, try to keep the if else with the two most common items first. If the values are scattered evenly throughout (such as swith(char) where char is anything from 0 to 255), try to break the switch into sections and handle each case within(if char < 128 else if char >=128). Even then the predictor will only stall on the next switch.
Otherwise, (And my personal favorite solution!) create a lookup table of pointers to functions and populate it once upon initialization. Then, when you go to do the lookup, the lookup can handle the case really quickly, such as:
typedef struct __Lookup
{
FuncPtr Ptr;
} Lookup, *pLookup;
// populate the table somehow.
Lookup m_Lookup[] = {};
To do the lookup for value 5:
just call the function!
int iFunc = 5;
(*m_Lookup[iFunc].Ptr)();
I have used that method often which only requires a couple of assembly statements in operation (pushing a memory location, and stack) and is quite simple and effective with predictive path operations in processors. JUST MAKE SURE TO DOUBLE CHECK THE INTEGER TO ENSURE IT DOESN'T WALK OVER THE END OF YOUR STRUCTURE!
I hope this helps.