为什么以下代码总是进入if块内部
本文关键字:if 内部 代码 为什么 | 更新日期: 2023-09-27 17:59:42
有人能告诉我如何解决这个问题吗?
int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
//Comes in here ? Why ? When a=3 ?
}
您的逻辑是错误的,这是一个常见的错误。当自然说话时,您会说您希望在a
不是1、2或3时执行if
-块。然而,自然语言可能会导致混淆和歧义,在将其翻译成正式的布尔表达式时必须小心。在布尔逻辑中,正确的表达式是:
if( !(a == 1 || a == 2 || a == 3) ) { ... }
使用德摩根定律,我们可以将这种否定改写为:
if( a != 1 && a != 2 && a != 3 ) { ... }
这里,原子(a == 1
、a == 2
和a == 3
)被否定,并且析取(||
)变成连词(&&
)。
一开始这可能看起来有违直觉,但仔细观察,这确实是正确的表达方式,这是合乎逻辑的。
如果是a != 1
、a != 2
或a != 3
,则原始表达式的计算结果将为true
。显然,如果这些原子中的一个失败(例如,a = 1
,因此a != 1
返回false
),则另一个原子必须成功(当a == 1
时,a != 2
和a != 3
)。如果(至少)其中一个原子返回true
,则析取(||
)评估为true
。正如我们刚刚指出的,总是至少有一个原子是true
,因此整个析取总是true
。这是一种重言式,并不完全是我们想要的。
如果a != 1
和a != 2
以及a != 3
,则正确的表达式将计算为true
。如果所有原子都成功,则连合(&&
)成功。例如,如果a == 1
,则第一个原子失败,从而整个结合失败。这就是我们想要的。
因为a != 1
。
当使用||
(或)运算符时,当任何条件为true
时,代码将进入if
块。由于其中一个条件将始终为true
,因此它将始终进入if块。
如果a不是1,a不是2或a不是3,则要求运行代码。
因此,代码将始终运行,因为没有一个a值可以同时为所有这些条件返回false。
因为您使用的是or
||
所以第一个语句CCD_ 36为真
如果你不希望它这样做,那么将||
更改为==
,那么它将不会进入,直到所有语句都为真。
因为a != 1
和a != 2
。
int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
// Wont run
}