缩短陈述并减少冗余

时间:2017-07-28 05:47:40

标签: c++ if-statement

新来的。我只是想知道是否可以使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 - ||语句。现在我被卡住了,是否有可能让它更短?如果您可以分享一些提示或方法来处理这种情况,我很高兴听到它。

5 个答案:

答案 0 :(得分:3)

这两种方法都不可读。最好创建一个指示您正在执行的检查类型的函数。

if ( !my_very_sensible_special_conditions_are_met(a, b, c, d, e) )
{
   return;
}

之后,无论是在函数实现中使用第一种方法还是第二种方法,都不是问题。

答案 1 :(得分:1)

条件阶梯(如果,否则如果)缩短

正如你所提到的,在所有的块中(if,else if)如果你只是拥有相同的语句集,那么你可以将所有条件与一个if语句放在适当的条件和适当的括号中。通过这样做代码会减少但是根据我的观点,你会有一些缺点

  • 可读性将降低
  • 将来,如果您想更改特定条件的代码,则需要一些时间进行更改。这不像在条件梯子中那么容易

如果你对上述两点没有任何问题,你可以自己采用你的方法。但是你的条件尽可能原子地编码。从长远来看,它会帮助你。

答案 2 :(得分:1)

鉴于条件的数量和复杂性,我至少考虑将其驱动为表格。目前,我假设ab实际上包含01

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;
}

不要在生产代码中这样做!