IT転職・プログラミングスクール

【Java】&&と&、||と|の違いは?Java Silver 例題

Java Silver 例題
管理人(じろー)
こんにちは。当ブログ管理者のじろーです。
独立系SIerでSEをしながら、ブログ運営をしています。

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。

今回は、&&と&、||と|の違いについてです。

複数の条件を定めるとき、
AかつBの場合は「 A && B 」
AまたはBの場合は「 A || B 」とするように始めに学びます。

しかし、「A & B 」「 A | B 」としても式は成立し、コンパイルは成功します。

&&と&、||と|は、同じ役割ですが厳密には異なった働きをします。

Java Silverではこの違いについて出題されるので、正しい知識を身につけておく必要があります。

 

問題:&&と&、||と|について

早速ですが、次の2問を解いてみてください。

問1

A.  -1
B.   0
C.   1
D.   2
E.   3
F.   コンパイルエラー

 

問2

A.  -1
B.   0
C.   1
D.   2
E.   3
F.   コンパイルエラー

 

一見シンプルで簡単そうな問題ですが、実は多くの人が間違った回答をしてしまいます。

 

答えは、問1B、問2Dです。

 

解説と解くコツ

&&と&、||と|は、どちらも「AかつB」、「AまたはB」のように同じ役割がありますが、条件式にインクリメンやデクリメントを含む場合に違った働きをします。

下に、それぞれの違いをまとめました。

&&と&の違い

●  A && B の場合

(++a==0 && ++b==0)とすると

++a==0がTRUE   :++bを実行し、++b==0を評価する
++a==0がFALSE  :++bを実行しない

●  A & B の場合

(++a==0 & ++b==0)とすると

++a==0がTRUEでもFALSEでも ++bを実行する

 

||と|の違い

●  A || B の場合

(++a==0 || ++b==0)とすると

++a==0がTRUE   :++bを実行しない
++a==0がFALSE  :++bを実行し、++b==0を評価する

●  A | B の場合

(++a==0 | ++b==0)とすると

++a==0がTRUEでもFALSEでも ++bを実行する

このように&&と||は、左側の結果によって右側の処理を実行有無が決まります。

一方、&と|は、左側の結果によらず、必ず右側の処理を実行します。

 

ポイント

次に、なぜこのような違いがあるかのポイントを解説します。

AかつBの場合、全体がTRUEとなるのはAもBもTRUEとなるときだけです。

そのため、最初に評価されるAがFALSEであればBの結果がなんであれ全体はFALSEになります。

したがって、「 A && B 」ではAがFALSEなら全体がFALSEで決まり、Bの評価は無視できるのでB内の処理は実行されません。

 

AまたはBの場合、全体がTRUEとなるのはAもBもFALSEではないときだけです。

そのため、AがTRUEであればBの結果がなんであれ全体はTRUEになります。

したがって、「 A || B 」ではAがTRUEなら全体はTRUEで決まり、Bの評価は無視できるのでB内の処理は実行されません。

 

解説

先ほどの&&と&、||と|の違いがわかっていれば、今回の問題は簡単に解くことができます。

問1

A.  -1
B.   0
C.   1
D.   2
E.   3
F.   コンパイルエラー

 

if文では && が使われており、
まず( ++a>1 )を評価すると、( 1>1 )となりFALSEになります。

したがって、全体もFALSEに決まるので右側の( ++b >1 )は実行されません。

この時点で a=1、b=1となり、8行目が実行され"0"が出力されるので、答えはBです。

 

問2

A.  -1
B.   0
C.   1
D.   2
E.   3
F.   コンパイルエラー

 

if文では || が使われており、
まず( ++a>0 )を評価すると、( 1>0 )となりTRUEになります。

したがって、全体もTRUEに決まるので右側の( ++b >1 )は実行されません。

この時点で a=1、b=1となり、6行目が実行され"2"が出力されるので、答えはDです。

 

 

補足として、今回はif内の"前置インクレメント"で解説をしましたが、デクリメントや後置式でも同じように&&と&、||と|により処理の有無が異なります。

-IT転職・プログラミングスクール
-,

Copyright© 人生2段飛ばし , 2020 All Rights Reserved Powered by AFFINGER5.