为什么以下代码总是在if块内?

时间:2013-02-15 22:58:10

标签: c#

有谁能告诉我如何解决这个问题?

int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
    //Comes in here ? Why ? When a=3 ?
}

5 个答案:

答案 0 :(得分:11)

你的逻辑错了,这是一个常见的错误。当你自然地说话时,你会说当if不是1,2或3时你想要a - 块执行。然而,自然语言可能会导致混淆和模棱两可,并且必须小心谨慎。将其转换为正式的布尔表达式。在布尔逻辑中,正确的表达式为:

if( !(a == 1 || a == 2 || a == 3) ) { ... }

使用De Morgan's law,我们可以将此否定重写为:

if( a != 1 && a != 2 && a != 3 ) { ... }

此处,原子(a == 1a == 2a == 3)被否定,分离(||)成为连词(&&)。

这一开始可能看起来反直觉,但仔细观察后,这确实是正确的表达是合乎逻辑的。

如果truea != 1a != 2,您的原始表达式将评估为a != 3。显然,如果其中一个原子失败(例如a = 1所以a != 1返回false),则另一个原子必须成功(a != 2a != 3 a == 1 1}})。如果(至少)其中一个原子返回||,则析取(true)求值为true。正如我们刚才所示,总有至少一个原子是true,因此整个析取总是true。这是tautology,不完全是我们想要的。

如果true a != 1 a != 2,正确的表达式将评估为a != 3。如果所有原子成功,则连接(&&)成功。例如,如果a == 1,则第一个原子失败,因此整个连接失败。这就是我们想要的。

答案 1 :(得分:2)

因为a != 1

使用||(或)运算符时,如果任何条件为if,代码将进入true块。由于其中一个条件始终为true,因此它将始终输入if块。

答案 2 :(得分:1)

如果a不是1,a不是2 a不是3,则要求代码运行。

因此代码将始终运行,因为没有任何值可以同时为所有这些条件返回false。

答案 3 :(得分:0)

它进入那里因为你正在使用or ||

所以在第一个语句a != 1为真,它继续进行。

如果您不希望它执行此操作,请将||更改为==,然后在所有陈述都为真之前不会进入。

答案 4 :(得分:0)

因为a != 1a != 2

int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
    // Wont run
}