为什么以下代码总是进入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 ?
}

为什么以下代码总是进入if块内部

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

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

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

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

这里,原子(a == 1a == 2a == 3)被否定,并且析取(||)变成连词(&&)。

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

如果是a != 1a != 2a != 3,则原始表达式的计算结果将为true。显然,如果这些原子中的一个失败(例如,a = 1,因此a != 1返回false),则另一个原子必须成功(当a == 1时,a != 2a != 3)。如果(至少)其中一个原子返回true,则析取(||)评估为true。正如我们刚刚指出的,总是至少有一个原子是true,因此整个析取总是true。这是一种重言式,并不完全是我们想要的。

如果a != 1a != 2以及a != 3,则正确的表达式将计算为true。如果所有原子都成功,则连合(&&)成功。例如,如果a == 1,则第一个原子失败,从而整个结合失败。这就是我们想要的。

因为a != 1

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

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

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

因为您使用的是or ||

所以第一个语句CCD_ 36为真

如果你不希望它这样做,那么将||更改为==,那么它将不会进入,直到所有语句都为真。

因为a != 1a != 2

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