if(loadFactor != null && !(trialExists(loadFactor))
和
if(!(loadFactor == null || trialExists(loadFactor))
如果我改成第二名,我会在评论中被要求获得第一名。它是如何产生任何影响的。
答案 0 :(得分:6)
他们要求您使用Java中的示例来展示De Morgan's laws的工作方式。
“不(A和B)”与“(不是A)或(不是B)”
相同还有,
“not(A或B)”与“(不是A)和(不是B)”
相同
(来自维基百科)
首先:
loadFactor != null && !(trialExists(loadFactor)
我们添加双重否定:
!!(loadFactor != null && !(tiralExists(loadFactor))
然后我们可以按照第一定律进行变换(不是(A和B)与(不是A)或(不是B)相同)
!(!(loadFactor != null) || !!(trialExists(loadFactor)))
现在我们可以删除双重否定:
!(loadFactor == null || trialExists(loadFactor))
我们从你的问题中得到第二句话。
答案 1 :(得分:5)
没有区别。
在这两种情况下:
loadFactor
为空,则不会评估trialExists(loadFactor)
,条件将为false,因此不会进入if
正文trialExists(loadFactor)
,条件将与结果相反 - 因此只有在if
返回false时才会进入trialExists(loadFactor)
语句的主体这是因为&&
和||
短路:
&&
的第一个操作数为false
,则不评估第二个操作数,结果只是false
||
的第一个操作数为true
,则不评估第二个操作数,结果只是true
我个人更喜欢第一段代码到第二段。它告诉我“如果我们有一个负载因子,并且没有对它进行试验。”第二段代码更加模糊,因为内部条件是“如果我们没有负载因子或者它是现有的试验” - 在我看来,这并不是一种特别自然的表达条件。
答案 2 :(得分:1)
没有区别。如果loadFactor为Null则两者都不会评估第二个条件,因此是好的。
审稿人可能认为首先不是短路的情况,如果loadFactor为空则会评估第二个条件。
答案 3 :(得分:1)
这两种情况都依赖于短路评估,以避免使用null参数调用函数。 &安培;&安培;如果first为真,则不评估secnnd arg,而||不评估第二个arg是第一个arg是假的。
所以答案是它没有区别,除了风格。
第一种形式更清晰,因为在这种特殊情况下你想要否定trialExists()只是巧合。