使用函数指针数组和切换之间是否有任何区别。ı写了这样的代码
// Declaritons of add-substract-multiply funcitons
void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};
unsigned int ch, a = 15, b = 10;
printf("Enter Choice: 0 for add, 1 for subtract and 2 "
"for multiply\n");
scanf("%d", &ch);
if (ch > 2) return 0;
(*fun_ptr_arr[ch])(a, b);
并且我想知道这段代码或使用开关会更好吗?(以效果为准)
带有相邻数字的switch
语句通常在内部优化为函数指针查找表。
从历史上看,编译器对此并不擅长,而函数指针表在过去总是更快。如今,对于任何一个版本,性能都不应该成为争论。实际上,手动函数指针表的一个缺点是编译器将无法内联函数,否则在优化switch
时它可以做一些事情。
因此,您不应使用函数指针版本,因为它更快/更慢,而因为它可以提高代码的可读性和维护性。
例如,在实现有限状态机时通常使用此类函数指针表。另一方面,复杂的switch
语句很难阅读,并且在语法上存在各种古怪之处,例如缺少的break
错误等。
最后,如果改为这样编写,则可以提高代码的可读性:
typedef void operation_t (int op1, int op2); // function type
operation_t* const op_array[] = {add, subtract, multiply}; // read-only function pointer table
op_array[i](a, b); // call specific function