先看一个使用switch语句的程序:
#include <stdio.h> #include <time.h> //加法 int add(int a,int b) { return a+b; } //减法 int subtract(int a,int b) { return a-b; } //乘法 int multi(int a,int b) { return a*b; } //除法 int divide(int a,int b) { return a/b; } int claculate(int a,int b,char oper) { //这里使用switch语句 switch (oper) { case '+': return add(a,b); case '-': return subtract(a,b); case '*': return multi(a,b); case '/': return divide(a,b); default: return -1; break; } } void main() { int a = 250; int b = 5; //统计程序执行时间 clock_t start, finish; start = clock(); printf("%d ",claculate(a,b,'+')); printf("%d ",claculate(a,b,'-')); printf("%d ",claculate(a,b,'*')); printf("%d ",claculate(a,b,'/')); finish = clock(); printf( "%f seconds ", (double)(finish - start) / CLOCKS_PER_SEC ); }再看一个使用函数指针数组的程序
#include <stdio.h> #include <time.h> //加法 int add(int a,int b) { return a+b; } //减法 int subtract(int a,int b) { return a-b; } //乘法 int multi(int a,int b) { return a*b; } //除法 int divide(int a,int b) { return a/b; } int claculate(int a,int b,int oper) { //事实上这里应该使用hashMap。将字符'+'映射到add函数。//直接使用数字是为了简便 //声明指向函数指针的数组 int (*pfunc[])(int a,int b) = {add,subtract,multi,divide}; return pfunc[oper](a,b); } void main() { int a = 250; int b = 5; //统计程序执行时间 clock_t start, finish; start = clock(); printf("%d ",claculate(a,b,0)); printf("%d ",claculate(a,b,1)); printf("%d ",claculate(a,b,2)); printf("%d ",claculate(a,b,3)); finish = clock(); printf( "%f seconds ", (double)(finish - start) / CLOCKS_PER_SEC ); }
当switch推断语句中case的个数不多时,上面两个程序几乎相同。但假设case非常多时,使用函数指针数组要快非常多。
类似地。在Java里面也能够使用反射来代替swith语句产生类似的效果。