首页 > 解决方案 > 如何减少c语言if语句中的多个OR条件

问题描述

对于此代码,我得到“函数的复杂度为 48,大于授权的 20。” 如何降低复杂性?

void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value, int mandatory)
#else
static void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value, int mandatory)
#endif
{
        if(strcmp(tag,"probableCause") == 0){
                if((value >=0 && value <= 20)||(value >= 51 && value <= 70)||(value >= 81 && value <= 82)||(value >= 101 && value <= 133)||(value >= 151 && value <= 158)||(value >= 301 && value <= 303)||(value >= 305 && value <= 308)||(value >= 310 && value <= 311)||(value >= 315 && value <= 317)||(value >= 321 && value <= 327) ||(value >= 332 && value <= 334)||(value >= 339 && value <= 340)||(value >= 342 && value <= 348)||(value >= 350 && value <= 354)||(value >= 356 && value <= 357)||(value >= 501 && value <= 552)||(value >= 561 && value <= 593)||(value >= 701 && value <= 709)||(value >= 711 && value <= 718)||(value >= 1000 && value <= 1065)){
                        bufprintf(buf, "<%s>", tag);
                        bufprintf(buf, "%i", value);
                        bufprintf(buf, "</%s>", tag);
                        bufprintf(buf, "\n");
                }
                else if((value == 136 || value == 203 || value == 313 || value ==330 || value == 336)){
                        bufprintf(buf, "<%s>", tag);
                        bufprintf(buf, "%i", value);
                        bufprintf(buf, "</%s>", tag);
                        bufprintf(buf, "\n");
                }
                else{}
        }
        else{
                if(value != 0){  /* OSS_FC_013378_US_4370787_US_4745111: Schema validation using libxml2 for FM */
                        bufprintf(buf, "<%s>", tag);
                        bufprintf(buf, "%i", value);
                        bufprintf(buf, "</%s>", tag);
                        bufprintf(buf, "\n");
                }
        }
}

标签: c

解决方案


使用表格来测试范围,包括多数字范围和单例范围,如下所示:

struct range
{
    int lo;
    int hi;
};

static const struct range ranges[] =
{
    {    0,   20 },
    {   51,   70 },
    {   81,   82 },
    {  101,  133 },
    {  136,  136 },     /* Singleton */
    {  151,  158 },
    {  203,  203 },     /* Singleton */
    {  301,  303 },
    {  305,  308 },
    {  310,  311 },
    {  313,  313 },     /* Singleton */
    {  315,  317 },
    {  321,  327 },
    {  330,  330 },     /* Singleton */
    {  332,  334 },
    {  336,  336 },     /* Singleton */
    {  339,  340 },
    {  342,  348 },
    {  350,  354 },
    {  356,  357 },
    {  501,  552 },
    {  561,  593 },
    {  701,  709 },
    {  711,  718 },
    { 1000, 1065 },
};
enum { NUM_RANGES = sizeof(ranges) / sizeof(ranges[0]) };

extern void bufprintf(p_printbuffer buf, const char *tag, ...);

static void print_tag_value(p_printbuffer buf, const char *tag, int value)
{
    bufprintf(buf, "<%s>", tag);
    bufprintf(buf, "%i", value);
    bufprintf(buf, "</%s>", tag);
    bufprintf(buf, "\n");
}

static void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value)
{
    if (strcmp(tag, "probableCause") == 0)
    {
        for (int i = 0; i < NUM_RANGES; i++)
        {
            if (value >= ranges[i].lo && value <= ranges[i].hi)
            {
                print_tag_value(buf, tag, value);
                break;
            }
        }
    }
    else if (value != 0)
    {
        print_tag_value(buf, tag, value);
    }
}

如果bufprintf()是 的专用版本printf(),则可以将 4 个调用的顺序减少到一个调用。该问题已更新以提供界面print_element_int_to_buf()功能。它包括一个未使用的参数mandatory,我在修改后的函数中省略了它。我已经使用这些信息为该bufprintf()函数提供了一个合理的原型。


推荐阅读