私が行き詰まっている部分は
boolean(0 % 2 !=0)
== false です。つまり、2 が 0 に 0 回入ると、残りは 2 になり、2 は 0 に等しくないということです。したがって、それは正しいはずです。しかし、ブール値をJavaプログラムに入れると、それは偽として扱われます。理由を知っている人はいますか?
私が頭を包むことができる唯一の論理的な答えは、おそらく整数が0になり、無限の回数になり、偽として認識されるということです。
次の 2 つの手順があります。
0 % 2
に評価され0
ます。
0 != 0
に評価されfalse
ます。
最初のステップを詳しく説明すると、JLSは次のように演算子を定義します。%
二項 % 演算子は、暗黙の除算からオペランドの残りを生成すると言われています。左側のオペランドは被除数で、右側のオペランドは除数です。
で割った余り0
はであり、あなたが思っているほど2
では0
ありません2
。
%
除算後の剰余を返します。ゼロを何か (それ自体を除く) で割るとゼロなので余りはありません。
したがって0 % 2
です0
。
0/2 = 0 およびリマインダー 0、または 0*2+リマインダー = 0 であるため、0%2 = 0。
モジュラスを誤解しているだけです。
0%2 と 2%0 を混同していると思います (これは不可能です)。0%n は常に 0 です。
では、それを分析しましょう…</p>
1)0 % 2
modulo は有限除算の残りです。たとえば、10%3 は 10/3 の残りです。10/3 は 3+⅓ です。なので残りは1です。
0%2 は 0/2 の残りです。0/2=0、休みがないので、0%2=0。
2)0 % 2 != 0
これは、0%2 が 0 とは異なることを意味します。これは誤りであることがわかりました。
3)boolean(0 % 2 != 0)
単純にキャストです。結果をブール値にキャストします。単なる誤った仮定ではなく、Java 値を取得しますfalse
。
4)boolean(0 % 2 != 0) == false
ここ==
にテストがあるということです。テストは (上記のように) のように簡略化できますfalse == false
。false
に等しいfalse
ですか?はい、そうです。結果はtrue
です。
これは、Java インタープリターが演算子を評価する順序である演算子の優先順位と関係があります。
ドキュメントについては、こちらを参照してください。便利な頭字語の 1 つは BUDMASRELCA - Brackets 、U nary 、 D iv- M ultiplication (モジュロが含まれているため、実際には乗法)、Addittion- Subtraction 、Relational、E quality、Logical、Conditional (3 値)、Assignmentです。Bitwise 演算子を見逃してしまいましたが、Logical の下にグループ化することができ、通常の論理演算子よりも優先されます。
0 % 2 !=0 は最初に 0%2 (乗法) として評価され、次にその結果 0 が != 0 で評価されます。 (等式)
内部的に、コンパイラはバイナリ式ツリーを構築して、以下に示すように、演算子をルートとして使用し、値またはさらなる演算子 (再帰的な場合) として葉を使用して、順序を表します。そのため、ルート オペレータを葉の値で評価する前に、オペレータを持つサブツリーを評価する必要があります。
!=
/ \
% 0
/\
0 2
2 が 0 に 0 回入ると、余りは 2 になります。
2 goes into 0
butではない0 goes into 2
ので、除算の結果は 0 でリマインダーは 0 です。