-2

この問題を解決する方法を教えてください。

int a = 3;
if(a != 1 || a!=2 || a!=3 )
{
    //Comes in here ? Why ? When a=3 ?
}
4

5 に答える 5

11

あなたの論理は間違っています、そしてそれはよくある間違いです。自然に話すときは、が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

于 2013-02-15T23:03:17.533 に答える
2

なぜならa != 1

||(または)演算子を使用する場合if、条件のいずれかが。の場合、コードはブロックに入りますtrue。条件の1つは常にであるためtrue、常にifブロックに入ります。

于 2013-02-15T23:00:58.920 に答える
1

aが1でない場合、aが2でない場合、またはaが3でない場合に、コードを実行するように要求しています。

これらすべての条件に対して一度にfalseを返すことができるaの値がないため、そのコードは常に実行されます。

于 2013-02-15T23:00:55.880 に答える
0

あなたが使用しているので、そこに入るor ||

したがって、最初のステートメントa != 1は真であり、それはで続きます。

あなたがそれをしたくない場合は、に変更||==てください。すべてのステートメントが真になるまで、それは入りません。

于 2013-02-15T23:00:16.957 に答える
0

a != 1a != 2。_

int a = 3;
if(a != 1 && a!=2 && a!=3 )
{
    // Wont run
}
于 2013-02-15T23:03:08.267 に答える