如何避免在C中嵌套ifs?

约翰·亨利·加利诺

我在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;
    }
}
普拉平

在您的示例中,绝对没有必要使用any 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,而且可以理解

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何避免在SwiftUI中嵌套导航栏?

来自分类Java

如何避免嵌套ActionListener?

来自分类Dev

在Objective-C中避免使用异步代码嵌套块

来自分类Dev

如何避免在laravel(php)中嵌套查询?

来自分类Dev

如何避免嵌套对象中的“未定义”错误

来自分类Java

如何避免在Java中嵌套for循环以获取分层数据?

来自分类Dev

如何避免嵌套订阅

来自分类Dev

如何避免嵌套模板中重复的模板参数

来自分类Dev

如何避免Firebase Cloud Function中的嵌套承诺

来自分类Dev

使用DURATION时如何在Google表格中设置嵌套IFS

来自分类Dev

如何避免嵌套承诺?

来自分类Dev

如何避免在嵌套类结构中重复属性?

来自分类Dev

避免在JavaScript中嵌套

来自分类Dev

如何使用switchmap避免Angular中的嵌套订阅?

来自分类Dev

如何避免在json字符串中额外嵌套

来自分类Dev

如何避免Elixir中的if嵌套语句?

来自分类Dev

如何避免量角器中的深层嵌套承诺

来自分类Dev

如何避免在 RxJava2 中嵌套 Single

来自分类Dev

如何避免嵌套承诺?

来自分类Dev

如何避免 RxJava 中的嵌套回调?

来自分类Dev

如何避免SQL中的嵌套子查询

来自分类Dev

如何避免渲染中的嵌套三元?

来自分类Dev

如何避免 Spark 中的嵌套地图调用?

来自分类Dev

如何避免 JSX 中嵌套的三元 ESLint 错误

来自分类Dev

如何避免在嵌套字典中添加重复值?

来自分类Dev

如何避免 Clojure 中的嵌套 `for` 函数?

来自分类Dev

如何避免每个命令的ifs?

来自分类Dev

如何避免此問題中的嵌套 for 循環

来自分类Dev

如何避免輸入條目中的ifs