-2

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

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

5 回答 5

11

你的逻辑是错误的,这是一个常见的错误。当自然地说话时,你会说你希望if-block 在a不是 1、2 或 3 时执行。然而,自然语言可能会导致混淆和歧义,在将其翻译成正式的布尔表达式时必须小心。在布尔逻辑中,正确的表达式是:

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

使用德摩根定律,我们可以将这个否定重写为:

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

在这里,原子 ( a == 1,a == 2a == 3) 被取反,析取 ( ||) 变成连词 ( &&)。

乍一看,这似乎违反直觉,但仔细观察,这确实是正确的表达是合乎逻辑的。

您的原始表达式将评估为trueifa != 1或 ifa != 2或 if a != 3。显然,如果其中一个原子失败(例如,a = 1返回a != 1false,另一个原子必须成功(a != 2以及a != 3何时a == 1)。析取 ( ||) 评估true是否(至少)其中一个原子返回true。正如我们刚刚展示的,总是至少有一个原子是true,因此整个析取总是true。这是一个重言式,不完全是我们想要的。

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

于 2013-02-15T23:03:17.533 回答
2

因为a != 1.

使用||(or) 运算符时,当任何条件为 时,代码将进入iftrue。由于条件之一将始终为true,因此它将始终进入 if 块。

于 2013-02-15T23:00:58.920 回答
1

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

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

于 2013-02-15T23:00:55.880 回答
0

它进去是因为你正在使用or ||

所以第一个陈述a != 1是真的,它继续下去。

如果您不希望它这样做然后更改||==then 它不会进入,直到所有陈述都是真实的。

于 2013-02-15T23:00:16.957 回答
0

因为a != 1a != 2

int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
    // Wont run
}
于 2013-02-15T23:03:08.267 回答