c – Big if else声明

前端之家收集整理的这篇文章主要介绍了c – Big if else声明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果有一个大的(大约100加)if else语句如下,if else条件可能是不规则的(例如一些取决于3个变量,有些取决于4),有没有办法让它变得更简单?

基本上我有一个大约100多行的表,其中a,b,c和d作为列.基于a,c和d,我需要执行3种不同类型的功能.

该表描述了一组业务规则.

uint8 a;
 uint8 b;
 uint16 c;
 uint8  d;

 if      ( a == 1 &&   b == 1           && c == 0)           { functionA();}
 else if ( a == 5 &&   b == 5           && c == 2 && d == 2) { functionB();}
 else if ( a == 1 && (b ==36 || b == 7) && c == 0)           { functionC();}  
 else if ( a == 3 &&   b == 3                     && d == 50) {functionA();}
    :
    :

解决方法

有很多方法可以使它更简单,例如:

>您可以从包含a,c和d值的结构填充地图以检查要调用函数(填充地图的代码可能仍然是一团糟,但它会更快更清晰地执行;可以为案例添加两个键ala b == x || b == y)
>你可以手动分析条件:给出你的例子,如果(a == 1)if(b == 1&& c == 0)functionA();否则if((b == 36 || b == 7)&& c == 0)functionC();. switch语句可以使这个更干净.在这样的分解中,您还可以使用<,< =,>和/或> =来划分更大的搜索空间,从而将性能从O(N)提高到O(log2N).
>对于测试a,c和d一次的常见简单情况,使用宏ala #define ELIF_ABCD(A,B,C,D,F)否则if(a ==(A)&& b ==(B)&& c ==(C)&& d ==(D))F();.根据需要为其他测试组合添加宏,例如ABD,ABC,AD.
>(可能使代码更加神秘),但可以探索位移和将值组合成一个足够大的类型(int64_t),然后例如.二进制搜索函数指针数组

值得注意的是,if / else链可能包含以下内容

if (a == 1 && c == 3 && d == 2) functionY();
else if (a == 1 && b == 2 && c == 3) function X();

这里,顺序很重要,因为输入可以匹配两者.如果不同地考虑搜索或者使用某种方式对函数指针进行索引,则这个方面很容易丢失或改变,这是支持上述宏方法的一个论据.

原文链接:https://www.f2er.com/c/116541.html

猜你在找的C&C++相关文章