如果语句的工作方式与预期不同

时间:2014-04-28 22:08:19

标签: c#

这可能是也可能不是一个愚蠢的问题,但为什么以下2个if语句会产生不同的结果

让我们说k = "z";

  1. if (!k=="x" || !k=="y")

    {

    //do something

    }

  2. 2

    if (!(k=="x" || k=="y"))
    
    {
    
    //do something
    
    }
    

    在我看来,这两个陈述都应该点击// Do Something ....只有底部的一个才会被击中。 btw是预期的结果。

    再次对不起,不过我无法解决这个问题。

2 个答案:

答案 0 :(得分:12)

您的问题是“为什么(NOT X) OR (NOT Y)NOT(X OR Y)不同?”

如果X或Y为真,则

NOT(X OR Y)为假,否则为真。

如果X和Y都为真,则

(NOT X) OR (NOT Y)为假,否则为真。

“X或Y为真”和“X和Y都为真”是不同的。

当你感到困惑时,这是一个很好的技巧:画一个真值表:

X    Y    NOT X    NOT Y    X OR Y    (NOT X) OR (NOT Y)   NOT(X OR Y)
T    T     F         F       T                F                F
T    F     F         T       T                T                F
F    T     T         F       T                T                F
F    F     T         T       F                T                T

现在很清楚它们是不同的吗?

如果你现在为NOT(X AND Y)绘制真值表,你会发现它与(NOT X) OR (NOT Y)相同,所以这两个表达式是等价的。

如果你绘制(NOT X) AND (NOT Y)的真值表,你会发现它与NOT(X OR Y)相同。同样,这两个表达式是等价的。

确保清楚。

现在,你有一个更大的问题:

k != "x" || k != "y"

这个谓词不可能是真的。假设k是“x”。然后它显然不是“y”,所以谓词是真的。假设k是“y”。那么它显然不是“x”,所以谓词是真的。假设k是任何其他值。那么它显然既不是“x”也不是“y”,所以谓词是正确的。因此无论如何,这都是真实的。 (NOT X) OR (NOT Y) 表示“既不是X也不是Y”。

答案 1 :(得分:7)

这是因为您错过了解逻辑表达式评估。有关DeMorgans Laws的详细信息,请参阅维基百科页面,以便进一步阅读,但您需要的是这一点......

!(A || B)!A && !B

相同

这不是一个非常愚蠢的问题......这是一个非常容易制作的逻辑错误,并且也很常见。

为了完整性,我还应该添加以下内容......

!A || !B!(A && B)

相同
相关问题