我在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] 删除。
我来说两句