这两个ifs有什么区别?

时间:2014-01-18 08:26:54

标签: java

if(loadFactor != null && !(trialExists(loadFactor))

if(!(loadFactor == null || trialExists(loadFactor))

如果我改成第二名,我会在评论中被要求获得第一名。它是如何产生任何影响的。

4 个答案:

答案 0 :(得分:6)

他们要求您使用Java中的示例来展示De Morgan's laws的工作方式。

  

“不(A和B)”与“(不是A)或(不是B)”

相同      

还有,

     

“not(A或B)”与“(不是A)和(不是B)”

相同

(来自维基百科

  1. 首先:

    loadFactor != null && !(trialExists(loadFactor)
    
  2. 我们添加双重否定:

    !!(loadFactor != null && !(tiralExists(loadFactor))
    
  3. 然后我们可以按照第一定律进行变换(不是(A和B)与(不是A)或(不是B)相同)

    !(!(loadFactor != null) || !!(trialExists(loadFactor)))
    
  4. 现在我们可以删除双重否定:

    !(loadFactor == null || trialExists(loadFactor))
    
  5. 我们从你的问题中得到第二句话。

答案 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()只是巧合。