繁体   English   中英

如何避免 C 中的嵌套 ifs?

[英]How to avoid nested ifs in C?

我在 C 中有这段代码,我希望expCompare没有嵌套的 ifs。 请问除了这个还有别的办法吗?

typedef struct expo Exponent;
struct expo {
    char tag;
    int ex;
    int ey;
    int ez;
};

int expCompare(Exponent alpha, Exponent beta) {
    if (alpha.ex > beta.ex) {
        return 1;
    } else if (alpha.ex == beta.ex) {
        if (alpha.ey > beta.ey) {
            return 1;
        } else if (alpha.ey == beta.ey) {
            if (alpha.ez > beta.ez) {
                return 1;
            } else if (alpha.ez == beta.ez){
                return 0;
            } else {
                return -1;
            }
        } else {
            return -1;
        }
    } else {
        return -1;
    }
}

对于您的示例,绝对没有必要使用任何else ,因为在return之后,程序流程无论如何都无法继续。

我会这样写比较 function:

int expCompare(Exponent alpha, Exponent beta) {
    if (alpha.ex > beta.ex)
        return 1;
    if (alpha.ex != beta.ex)
        return -1;
    if (alpha.ey > beta.ey)
        return 1;
    if (alpha.ey != beta.ey)
        return -1;
    if (alpha.ez > beta.ez)
        return 1;
    if (alpha.ez == beta.ez)
        return 0;
    return -1;
}

即使没有提前return ,也可以通过连续使用else if来避免所有缩进,例如:

int expCompare(Exponent alpha, Exponent beta) {
    int result = -1;
    if (alpha.ex > beta.ex)
        result = 1;
    else if (alpha.ex != beta.ex)
        result = -1;
    else if (alpha.ey > beta.ey)
        result = 1;
    else if (alpha.ey != beta.ey)
        result = -1;
    else if (alpha.ez > beta.ez)
        result = 1;
    else if (alpha.ez == beta.ez)
        result = 0;
    return result;
}

请注意,对于一个接一个地比较struct对象的特定用法,我编写了一个在我们的代码库中使用的宏,它显着简化了该通用模式。 它会像这样 go:

static int compareValues(int a, int b)
{
    if (a > b)
        return 1;
    if (a < b)
        return -1;
    return 0;
}

#define COMPARE_VALUES_RETURN_IF_DIFFERENT(a,b) \
    do { int result = compareValues((a), (b)); \
    if(result) return result; } while(0)

int expCompare(Exponent alpha, Exponent beta) {
    COMPARE_VALUES_RETURN_IF_DIFFERENT(alpha.ex, beta.ex);
    COMPARE_VALUES_RETURN_IF_DIFFERENT(alpha.ey, beta.ey);
    COMPARE_VALUES_RETURN_IF_DIFFERENT(alpha.ez, beta.ez);
    return 0;
}

在我们的示例中, compareValues是 C++ 中的重写 function,它可以比较多种类型,不仅是int ,而且您明白了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM