我很难理解摩根法律,以及它与布尔逻辑和表达方式的关系。特别是使用boolean逻辑和&&,|和!操作员。
因此,我知道在C编程中,de Morgans定律是一种以不同的方式重新调整表达方式的方式(不使用,或)。
例如:
!(condition1 && condition2)
也等于:
!condition1 || !condition two
和:
condition1 && !(condition2)
也等于:
condition1 || !condition2
(我们只是将括号乘以在这里的一单位否定词吗?就像在良好的代数天吗?)
我的大脑开始煎炸的地方是我评估表达更棘手的时候,以及如何使用布尔逻辑重写它。我已经在任何帮助的情况下搜索了任何过去的线程,但仍然无法将我的头缠绕在此方面。我开始写出真相表,但无法弄清楚如何基于下面的表达式。我会尽力而为,所以请原谅任何错误或不良的练习。
(请注意,以下代码在技术上不是完成C代码,只是我试图使用布尔逻辑编写的表达式的示例,以将其整合到C代码中。)
我无法将其整合到我的任何C程序中,因为我无法获得它。
例如:
!( a > 12 ) && !(b >= 3 )
本质上是指数(事实前的真相):
a > 12 && b >= 3
表示A大于12,并且B要么大于或等于3。
将其带到真相表:
a b a&&b
1 0 false - a is greater than 12, but b is not greater than or equal to 3.
0 1 false - this time a is less than 12 while b >= 3.
0 0 false - a is not > 12 and b is not >= 3.
1 1 true - a is greater than 12, and b is >= 3.
现在应用非操作员:(这是我开始丢失的地方)
!( a > 12 ) && !( b >= 3 )
并使用de Morgans法律写(尝试)同等学历:所以…
!( a > 12 ) && !( b >= 3 )
等于
a < 12 || b < 3
(是否有一种方法可以在真相表中进行交叉比较,以查看它们是否真的相等?)
另一个,这次有点棘手...
!( a == b ) && !( c != 2 )
等效于:
(a != b) || (c = 2)
最后
!( (a < 9 ) || ( b <=3 ) )
等效于:
a > 9 && b > 3
我不确定其中的任何一个是否正确,但是我认为最好的办法就是停止阅读它,然后继续尝试。
已经很长一段时间了,但是我总是记得它的一般表达式:
A op B (where op is and,or) NOTE: A and B could be "sub-expressions"
1) Change or to and, and to or
2) Invert the individual terms
3) Invert the entire expression
A and B => !(!A or !B)
A or B => !(!A and !B)
a和b的真相表:
A B | A&B
------------
T T | T
T F | F
F T | F
F F | F
A B !A !B !A|!B !(!A|!B)
------------------------------
T T F F F T
T F F T T F
F T T F T F
F F T T T F
看来您在看条件零件并过度思考事物。
让我们看一下规则:
not A AND not B = not (A OR B)
not A OR not B = not (A AND B)
用普通的英语,这意味着您可以分发一个不和倒转和或。因此,鉴于此表达式:
!( a > 12 ) && !(b >= 3 )
这符合规则的第一个版本。离开>
和>=
,您可以分发并非双方分发:
!(( a > 12 ) || (b >= 3 ))
并将其更改为OR,并且(这是您错过的部分)未被拉出。同样,这是:
!( a == b ) && !( c != 2 )
变为:
!(( a == b ) || ( c != 2 ))
然后最后一个:
!( (a < 9 ) || ( b <=3 ) )
通过demorgan的定律转入这一点:
!(a < 9 ) && !(b <=3 )
然后切换条件:
(a >= 9 ) && (b > 3 )
我认为您感到困惑的是,您试图同时翻转有条件的条件并应用Demorgan的法律。不要那样做。根据需要单独执行每个部分。