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