簡體   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