この問題を解決する方法を教えてください。
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 ?
}
あなたの論理は間違っています、そしてそれはよくある間違いです。自然に話すときは、が1、2、または3でないif
ときに-blockを実行する必要があります。ただし、自然言語は混乱やあいまいさをもたらす可能性があるため、正式なブール式に変換する場合は注意が必要です。a
ブール論理では、正しい式は次のようになります。
if( !(a == 1 || a == 2 || a == 3) ) { ... }
ド・モルガンの法則を使用して、この否定を次のように書き直すことができます。
if( a != 1 && a != 2 && a != 3 ) { ... }
ここで、アトム(a == 1
、、a == 2
およびa == 3
)は否定され、論理和(||
)は接続詞(&&
)になります。
これは最初は直感に反しているように見えるかもしれませんが、よく調べてみると、これが実際に正しい表現であることが論理的です。
元の式は、 if、 true
if 、a != 1
またはifに評価されます。明らかに、これらのアトムの1つが失敗した場合(たとえば、returns )、別のアトムが成功する必要があります(また、の場合)。論理和( )は、(少なくとも)アトムの1つが。を返すかどうかを評価します。先ほど示したように、常に少なくとも1つの原子が存在するため、論理和全体は常にです。これはトートロジーであり、私たちが探していたものではありません。a != 2
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
。
||
(または)演算子を使用する場合if
、条件のいずれかが。の場合、コードはブロックに入りますtrue
。条件の1つは常にであるためtrue
、常にifブロックに入ります。
aが1でない場合、aが2でない場合、またはaが3でない場合に、コードを実行するように要求しています。
これらすべての条件に対して一度にfalseを返すことができるaの値がないため、そのコードは常に実行されます。
あなたが使用しているので、そこに入るor
||
したがって、最初のステートメントa != 1
は真であり、それはで続きます。
あなたがそれをしたくない場合は、に変更||
し==
てください。すべてのステートメントが真になるまで、それは入りません。
a != 1
とa != 2
。_
int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
// Wont run
}