Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在C中嵌套ifs?_C_Function_If Statement_Struct_Nested - Fatal编程技术网

如何避免在C中嵌套ifs?

如何避免在C中嵌套ifs?,c,function,if-statement,struct,nested,C,Function,If Statement,Struct,Nested,我这里有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;

我这里有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
,因为在
返回后,程序流无论如何都无法继续

我会这样编写比较函数:

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;
}
即使没有早期的
返回
,如果
类似于:

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;
}
静态整数比较值(整数a、整数b)
{
如果(a>b)
返回1;
if(a

我们的例子中,<代码> CuasReals是C++中的一个重写函数,它可以比较几种类型,不仅是代码> int <代码>,而且你得到了点。

使用逻辑运算符<代码> >((α= Ex=betaβ)和&(alpay.e>β))< /C>