繁体   English   中英

如何在单个 return 语句中简化此逻辑表达式?

[英]How to simplify this logical expression in a single return statement?

我一直试图在一个单一的return A... B... C声明中简化这个 function 但有些情况总是会漏掉。 如何以合乎逻辑的方式表达这种检查(使用andornot等)?

bool f(bool C, bool B, bool A)
{
if (A)
    return true;

if (B)
    return false;
   
if (C)
    return true;

return false;
}
bool f(bool C, bool B, bool A)
{
if (A)
    return true;

if (B)
    return false;
   
if (C)
    return true;

return false;
}

相当于

bool f(bool C, bool B, bool A)
{
if (A)
    return true;
else if (B)
    return false;
else if (C)
    return true;
else 
    return false;
}

相当于:

bool f(bool C, bool B, bool A)
{
if (A)
    return true;
else if (!B)
{
    if (C)
        return true;
    else
        return false;
}
else
    return false;
}

相当于:

bool f(bool C, bool B, bool A)
{
if (A)
    return true;
else if (!B and C)
    return true;
else
    return false;
}

相当于:

bool f(bool C, bool B, bool A)
{
if (A or (!B and C))
    return true;
else
    return false;
}

相当于:

bool f(bool C, bool B, bool A)
{
return (A or (!B and C));
}

如果你写出所有的组合,你会得到一张桌子

在此处输入图像描述

static std::vector<bool> table{false, true, false, false, true, true, true, true};

然后你可以用它提取价值

table[4 * A + 2 * B + C]

更进一步,您可以简化为

242 & (A << 4 + B << 2 + C)

两者都是无分支的,这很好。

制作真值表

  A    B     C     return
  1    0     0     1
  1    0     1     1
  1    1     0     1
  1    1     1     1
  0    0     0     0
  0    0     1     1
  0    1     0     0
  0    1     1     0

然后你要么已经看到它可以被缩短,要么你只是尝试一些东西,例如:

bool f(bool C, bool B, bool A)
{
    return A || (C && not B);
}

然后写一个测试,看看它总是返回相同的。 我写了一个“手动”测试来查看是否生成了相同的真值表:

void test(bool A, bool B, bool C){
    std::cout << A << " " << B << " " << C << " " << f(C,B,A) << "\n";
}

int main()
{
  for (int A = 1; A >= 0; --A){
      for (int B = 0; B<2;++B){
          for (int C = 0; C<2;++C){
              test(A,B,C);
          }
      }
  }
}

事实上output 是

1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 1
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0

TL;DR:重构代码测试非常重要。 编写测试确保它通过,然后以微小的步骤重构并确保每个微小的重构仍然通过测试。

PS:更少的代码并不总是更简单。 根据实际情况(我希望在您的实际代码中它们的名称比ABC ),您的原始代码在表达代码意图方面可能比使用更少行的代码更好。

备选答案:

bool f(bool C, bool B, bool A)
{
if (A)
    return true;

if (B)
    return false;
   
if (C)
    return true;

return false;
}

您可以为此创建一个 boolean 矩阵:

一种 C f(C, B, A)
F F F F
F F
F F F
F F
F F
F
F

下半部分评估为if(A)其余条目为:

C f(C, B, A)
F F F
F
F F
F

这里只有一个真实案例: if(!B && C)

要组合这两个语句,您必须使用or因为只有其中一个需要评估为trueif((A) || (!B && C))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM