您可以创建一个数组,然后使用 for 循环在其中搜索相应的字符。但是在机器代码方面,这与开关完全相同,因此没有多大意义。
const char OPERATORS[] =
{
'+',
'-',
'*',
'/'
};
bool calculate (int x, char symbol, int y)
{
bool valid = false;
int i;
for(i=0; i<sizeof(OPERATORS); i++)
{
if(symbol == OPERATORS[i])
{
valid = true;
break;
}
}
if(!valid)
{
return valid;
}
operator_func[i](x, y);
return valid;
}
(上面唯一比开关更有效的地方是当有很多运算符并且您以排序顺序(按ASCII值)存储它们时。然后您可以进行二进制搜索而不是线性搜索for 循环。但是对于这几个运算符,这种搜索函数调用的开销只会减慢程序的速度。)
上面的好处是可以和函数指针表合并,得到更加面向对象的设计:
// the above rewritten with a bit of OO design:
typedef void(*operator_func_t)(int , int y);
typedef struct
{
char symbol;
operator_func_t func;
} operator_t;
...
void add (int x, int y);
void subtract (int x, int y);
...
operator_t OPERATORS[] =
{
{'+', &add},
{'-', &subtract},
{'*', &multiply},
{'/', ÷}
};