【问题标题】:How to avoid nested ifs in C?如何避免C中的嵌套ifs?
【发布时间】:2021-02-26 02:42:33
【问题描述】:

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

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;
    }
}

【问题讨论】:

  • 如何使用逻辑运算符if ( (alpha.ex == beta.ex) && (alpha.ey > beta.ey) )

标签: c function if-statement struct nested


【解决方案1】:

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

我会这样写比较函数:

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 对象的特殊用法,我编写了一个用于我们代码库的宏,它显着简化了该常见模式。它会是这样的:

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++ 中的一个重写函数,它可以比较多种类型,不仅是 int,而且你明白了。

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2015-04-10
    相关资源
    最近更新 更多