如何减少if..else这样的long语句?
if( strcmp( alnumToc, "log") == 0){
ARGNUMCHECK( in, 1);
mpfr_log( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "log2") == 0){
ARGNUMCHECK( in, 1);
mpfr_log2( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "log10") == 0){
ARGNUMCHECK( in, 1);
mpfr_log10( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sqrt") == 0){
ARGNUMCHECK( in, 1);
mpfr_sqrt( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cbrt") == 0){
ARGNUMCHECK( in, 1);
mpfr_cbrt( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "abs") == 0){
ARGNUMCHECK( in, 1);
mpfr_abs( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sin") == 0){
ARGNUMCHECK( in, 1);
mpfr_sin( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cos") == 0){
ARGNUMCHECK( in, 1);
mpfr_cos( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "csc") == 0){
ARGNUMCHECK( in, 1);
mpfr_csc( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cot") == 0){
ARGNUMCHECK( in, 1);
mpfr_cot( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "acos") == 0){
ARGNUMCHECK( in, 1);
mpfr_acos( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "asin") == 0){
ARGNUMCHECK( in, 1);
mpfr_asin( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "atan") == 0){
ARGNUMCHECK( in, 1);
mpfr_atan( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cosh") == 0){
ARGNUMCHECK( in, 1);
mpfr_cosh( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sinh") == 0){
ARGNUMCHECK( in, 1);
mpfr_sinh( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
}
Run Code Online (Sandbox Code Playgroud)
它不仅丑陋而且缓慢.我想过使用带有函数指针的哈希表.那是好的解决方案吗?
注意:会有一些mpfr函数,它们需要更多的参数,所以我不能只创建一个宏.
这是非常糟糕的代码,实际上它会非常慢.它必须从头开始重写.
最快的方法是将所有字符串文字存储在已排序的数组中,然后使用bsearch
它来搜索它.使用字符串数组,其中字符串是搜索键.您必须为结构类型编写自己的比较函数.
如果找到要查找的字符串,请通过函数指针调用其对应的函数:
typedef struct
{
const char* STRING;
func_t action;
} my_str_thing;
const my_str_thing TABLE [N] =
{
{ "ABC", do_this},
{ "DEF", do_that},
...
};
Run Code Online (Sandbox Code Playgroud)
哈希表也可以解决,但对于这个特定的情况似乎是不必要的复杂.