この問題を解決する方法を教えてください。
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、 trueif 、a != 1またはifに評価されます。明らかに、これらのアトムの1つが失敗した場合(たとえば、returns )、別のアトムが成功する必要があります(また、の場合)。論理和( )は、(少なくとも)アトムの1つが。を返すかどうかを評価します。先ほど示したように、常に少なくとも1つの原子が存在するため、論理和全体は常にです。これはトートロジーであり、私たちが探していたものではありません。a != 2a != 3a = 1a != 1falsea != 2a != 3a == 1||truetruetruetrue
正しい式は、trueifa != 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
}