[英]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.