我遇到了一些obj-c代码,我想知道是否有办法简化它:
#if ( A && !(B || C)) || ( B || C )
这与?
相同#if ( A || B || C )
如果没有,是否有其他方法可以更容易阅读?
[编辑] 在问这个问题之前我尝试了真值表,但我认为我不得不遗漏一些东西因为我怀疑Foundation.framework / Foundation.h会采用这种更复杂的形式。它有充分的理由吗?
这是原始代码(来自Foundation.h):
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)
答案 0 :(得分:13)
是。像其他人说的那样,你可以把它真相表。德摩根的规则也可以提供帮助。
但是,我认为最好的选择是使用Karnaugh Map。学习需要几分钟,但Karnaugh Maps允许您始终找到布尔逻辑的最小表达式。真值表可以验证最小化,但它们无法提供给您。
以下是我如何得到它:
首先,表格布局:
AB
00 01 11 10
0| | | | |
C 1| | | | |
现在,考虑你的等式,B || C总会引发真相:
AB
00 01 11 10
0| | T | T | |
C 1| T | T | T | T |
这只留下两个案例。在任何一种情况下,右侧评估为假。对于000,左侧也评估为假(0&&!(无论如何)为假)。适用于100,1和& !(0 ||| 0)计算结果为true。因此,声明是正确的。填写:
AB
00 01 11 10
0| F | T | T | T |
C 1| T | T | T | T |
现在,我们只需要“掩盖”所有真相。 “C”将覆盖底行。 “B”将覆盖中间正方形(四个值)。因此,“B || C”涵盖除右上方之外的所有方块。现在,“A”将覆盖正确的四空格。这是多余的,这是可以的。因此,“A || B || C”涵盖了所有真正的正方形,并省略了唯一的假正方形。
答案 1 :(得分:8)
A | B | C | (B || C) | (!(B || C)) | (A && !(B || C)) | (A && (!(B || C)) || (B || C) | (A || B || C)
------------------------------------------------------------------------------------------------------
T | T | T | T | F | F | T | T
T | T | F | T | F | F | T | T
T | F | T | T | F | F | T | T
T | F | F | F | T | T | T | T
F | T | T | T | F | F | T | T
F | T | F | T | F | F | T | T
F | F | T | T | F | F | T | T
F | F | F | F | T | F | F | F
根据最后两列,我会说是。
答案 2 :(得分:7)
获取笔+纸+尝试它,只有8种可能的输入
答案 3 :(得分:7)
他们是一样的。您可以使用Truth Table Generator对其进行测试。当false
,A
和B
为C
时,这两个表达式仅在一种情况下提供false
。
答案 4 :(得分:2)
是的,它是一样的。使用De Morgan规则:
(A&&!(B || C))|| (B || C)=(A&& B&& C)|| (B || C)。 所以当A = 1且B,C = 0时,第二个将成立。如果不是这样的话,当B ||时,第二部分(B || C)将为真。 C.所以它等于第一个。
答案 5 :(得分:1)
你也可以说:
(A&&!(B || C))|| (B || C)重写为(A&&!W)|| W(1)
(1)重写为(A&&!W)|| (A ||!A || W)(2)
(2)重写(A&&!W)|| (A || W)|| (!A || W)(3)
(3)重写(A&&!W)|| !(A&&!W)|| (A || W)(4)
(4)导致A || W然后 A || B || ç强>
答案 6 :(得分:0)
是的,这两个表达式是等价的。 (我刚刚编写了几个函数来测试所有八种可能性。)