新来的。我只是想知道是否可以使if语句更短,更少冗余。
if (!a && b)
{
if (c == d && e > 0)
{
return;
}
}
else if (a && !b)
{
if (c != d)
{
return;
}
}
else if (!a && !b)
{
return;
}
以下是
的最终结果if ((!a && b && c == d && e > 0) || (a && !b && c != d) || (!a && !b))
{
return;
}
我所做的只是使用if
运算符加入嵌套&&
语句,使用if
运算符加入else if
- ||
语句。现在我被卡住了,是否有可能让它更短?如果您可以分享一些提示或方法来处理这种情况,我很高兴听到它。
答案 0 :(得分:3)
这两种方法都不可读。最好创建一个指示您正在执行的检查类型的函数。
if ( !my_very_sensible_special_conditions_are_met(a, b, c, d, e) )
{
return;
}
之后,无论是在函数实现中使用第一种方法还是第二种方法,都不是问题。
答案 1 :(得分:1)
正如你所提到的,在所有的块中(if,else if)如果你只是拥有相同的语句集,那么你可以将所有条件与一个if语句放在适当的条件和适当的括号中。通过这样做代码会减少但是根据我的观点,你会有一些缺点
如果你对上述两点没有任何问题,你可以自己采用你的方法。但是你的条件尽可能原子地编码。从长远来看,它会帮助你。
答案 2 :(得分:1)
鉴于条件的数量和复杂性,我至少考虑将其驱动为表格。目前,我假设a
和b
实际上包含0
或1
。
int index = a | (b<<1) | (int(c==d)<<2) | (int(e>0) << 3);
static const bool should_return[] = {
1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0
};
if (should_return[index])
return;
该表仍然基本上是不可理解的,但至少它相当紧凑地编码了这种不可理解性,并且使代码很容易使用它。
答案 3 :(得分:0)
由于您评论说您总是在返回,并且由于您的代码未指定您是否在这些if - else
案例中执行了其他操作,为什么不这样做呢
if (! (a && b) )
{
return;
}
答案 4 :(得分:0)
你可以进一步缩短它:
if (!a && !b || !b && c != d || !a && c==d && e> 0) {
return;
}
但这并没有提高可读性,而且很可能也没有提高性能。我要关注的是,真实变量名称最自然的是什么 作为一般建议,我首先要检查更简单/更短的条件。这使得通常更容易看到您是否在以下方面进行了冗余检查。
无论如何,正如@ R.Sahu所建议的那样,像这样的复杂条件属于一个单独的,命名和注释的函数。如果你找不到一个好名字,可以使用像check_<main_function>_preconditions
。
修改强>
对不起,我无法抗拒:如果你想过火,你可以通过投三分声明使其变得非常紧凑:
if (!a && !b || c != d ? !b : !a && e> 0) {
return;
}
不要在生产代码中这样做!