[英]How to simplify this logical expression in a single return statement?
我一直試圖在一個單一的return A... B... C
聲明中簡化這個 function 但有些情況總是會漏掉。 如何以合乎邏輯的方式表達這種檢查(使用and
、 or
、 not
等)?
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));
}
制作真值表
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:更少的代碼並不總是更簡單。 根據實際情況(我希望在您的實際代碼中它們的名稱比A
、 B
和C
),您的原始代碼在表達代碼意圖方面可能比使用更少行的代碼更好。
備選答案:
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
因為只有其中一個需要評估為true
: if((A) || (!B && C))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.