如果报表的工作方式与预期不同

Don*_*yle -1 c#

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

我们说吧 k = "z";

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

    {

    //do something

    }

2.

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

{

//do something

}
Run Code Online (Sandbox Code Playgroud)

在我的脑海里,这两个陈述都应该点击// Do Something ....只有底部才会被击中.顺便说一句是预期的结果.

再次抱歉,但是我不能把我无知的思想包裹起来.

Eri*_*ert 12

你的问题是"为什么(NOT X) OR (NOT Y)与众不同NOT(X OR Y)?"

NOT(X OR Y) 如果X或Y为真,则为假,否则为真.

(NOT X) OR (NOT Y) 如果X和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
Run Code Online (Sandbox Code Playgroud)

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

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

如果你画出真值表,(NOT X) AND (NOT Y)你会发现它和它一样NOT(X OR Y).同样,这两个表达式是等价的.

确保清楚.

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

k != "x" || k != "y"
Run Code Online (Sandbox Code Playgroud)

这个谓词不可能是真的.假设k是"x".然后它显然不是"y",所以谓词是真的.假设k是"y".那么它显然不是"x",所以谓词是真的.假设k是任何其他值.那么它显然既不是"x"也不是"y",所以谓词是正确的.因此无论如何,这都是真实的. (NOT X) OR (NOT Y)不会意味着"x和y都不".


Kev*_*vin 7

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

!(A || B) 是相同的 !A && !B

这实际上并不是一个愚蠢的问题......这是一个非常简单的逻辑错误,也很常见.

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

!A || !B 是相同的 !(A && B)