谁能告诉我如何解决这个问题?
int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
//Comes in here ? Why ? When a=3 ?
}
谁能告诉我如何解决这个问题?
int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
//Comes in here ? Why ? When a=3 ?
}
你的逻辑是错误的,这是一个常见的错误。当自然地说话时,你会说你希望if
-block 在a
不是 1、2 或 3 时执行。然而,自然语言可能会导致混淆和歧义,在将其翻译成正式的布尔表达式时必须小心。在布尔逻辑中,正确的表达式是:
if( !(a == 1 || a == 2 || a == 3) ) { ... }
使用德摩根定律,我们可以将这个否定重写为:
if( a != 1 && a != 2 && a != 3 ) { ... }
在这里,原子 ( a == 1
,a == 2
和a == 3
) 被取反,析取 ( ||
) 变成连词 ( &&
)。
乍一看,这似乎违反直觉,但仔细观察,这确实是正确的表达是合乎逻辑的。
您的原始表达式将评估为true
ifa != 1
或 ifa != 2
或 if a != 3
。显然,如果其中一个原子失败(例如,a = 1
返回a != 1
)false
,另一个原子必须成功(a != 2
以及a != 3
何时a == 1
)。析取 ( ||
) 评估true
是否(至少)其中一个原子返回true
。正如我们刚刚展示的,总是至少有一个原子是true
,因此整个析取总是true
。这是一个重言式,不完全是我们想要的。
正确的表达式将评估为true
ifa != 1
和 a != 2
and a != 3
。如果所有原子都成功,则连词 ( &&
) 成功。例如,如果,第一个原子失败,因此整个合取失败。这就是我们想要的。a == 1
因为a != 1
.
使用||
(or) 运算符时,当任何条件为 时,代码将进入if
块true
。由于条件之一将始终为true
,因此它将始终进入 if 块。
如果 a 不是 1、a 不是 2或a 不是 3 ,您要求代码运行。
因此该代码将始终运行,因为没有任何值可以同时为所有这些条件返回 false。
它进去是因为你正在使用or
||
所以第一个陈述a != 1
是真的,它继续下去。
如果您不希望它这样做然后更改||
为==
then 它不会进入,直到所有陈述都是真实的。
因为a != 1
和a != 2
。
int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
// Wont run
}