有谁能告诉我如何解决这个问题?
int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
//Comes in here ? Why ? When a=3 ?
}
答案 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 == 1
,a == 2
和a == 3
)被否定,分离(||
)成为连词(&&
)。
这一开始可能看起来反直觉,但仔细观察后,这确实是正确的表达是合乎逻辑的。
如果true
,a != 1
或a != 2
,您的原始表达式将评估为a != 3
。显然,如果其中一个原子失败(例如a = 1
所以a != 1
返回false
),则另一个原子必须成功(a != 2
和a != 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 != 1
和a != 2
。
int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
// Wont run
}