在C语言中,转移表是一个指针数组,通常的作用是用来提高代码的可读性和维护性,也就是使得代码更加“好看”。
例如:
现在要求写一个关于计算器的代码用于基本的四则运算。
一般的写法:
//设置加减乘除的函数以便后续调用 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } //主函数实现计算器,并假设输入1为加法,2为减法,3为乘法,4为除法 int main() { int x, y; int input = 1; int ret = 0; scanf("%d", &input); switch (input) { case 1: printf("输⼊两个数:"); scanf("%d %d", &x, &y); ret = add(x, y); printf("ret = %d\n", ret); break; case 2: printf("输⼊两个数:"); scanf("%d %d", &x, &y); ret = sub(x, y); printf("ret = %d\n", ret); break; case 3: printf("输⼊两个数:"); scanf("%d %d", &x, &y); ret = mul(x, y); printf("ret = %d\n", ret); break; case 4: printf("输⼊两个数:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret); break; } return 0;
这种做法相当于使用switch语句来达到分支选项的实现,但是我们认为该代码的可读性以及长度都可以进行优化。我们可以使用一个函数指针数组(也就是一个转移表)来优化它。
int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } //上述函数均相同 int main() { int x, y; int input = 1; int ret = 0; int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表 printf( "请选择:" ); scanf("%d", &input); printf( "输⼊操作数:" ); scanf( "%d %d", &x, &y); ret = (*p[input])(x, y); printf( "ret = %d\n", ret); }
首先从长度上我们发现明显短了不少;其次我们可以注意到原先向纵向延伸的一系列选择(加减乘除)变为了横向延伸,函数指针数组可以使得函数在数组内元素变化的情况下直接被使用,这也脱离了switch语句的限制。
总而言之,操作表的使用可以大大提高程序的执行效率。