`java(0%2!= 0)== false`

我一直坚持的部分是boolean(0 % 2 !=0) == false。 我的意思是如果2进入0,0次然后余数将是2,而2不等于0.所以它应该是真的。 然而,当我把boolean放在我的java程序中时,它将它视为false。 谁知道为什么?

我可以解决的唯一合乎逻辑的答案是,整数可能会进入0和无限次,因此被认为是假的,任何人?

有两个步骤:

  • 0 % 2评估为0

  • 0 != 0计算结果为false

为了详细说明第一步,JLS 定义了%运算符,如下所示:

据说二进制%运算符从隐含的除法中产生其余的操作数; 左手操作数是被除数,右手操作数是除数。

0除以2的余数为0而不是2正如您所想的那样。

0%2 = 0,因为0/2 = 0且提醒0,或0 * 2 +提醒= 0。

你只是误解了模数。

%返回除法后的余数。 零除以任何东西(除了它本身!)为零,因此没有余数。

因此0 % 20

我认为你混淆0%2和2%0(这是不可能的)。 0%n始终等于0。

好吧,让我们剖析……

1) 0 % 2

模数是有限除法的其余部分。 例如,10%3是10/3的剩余部分。 10/3是3 +⅓。 剩下的就是1。

0%2是0/2的剩余部分。 0/2 = 0,没有rest,因此0%2 = 0。

2) 0 % 2 != 0

这意味着0%2不同于0.我们现在知道它是假的。

3) boolean(0 % 2 != 0)

它只是铸造。 您将结果转换为布尔值。 它不仅仅是一些错误的假设,而是使Java值false

4) boolean(0 % 2 != 0) == false

==表示此处有测试。 测试可以简化(如上所示)为false == falsefalse等于false吗? 是的。 结果是true

如果2进入0,0次,则余数为2。

它不是2 goes into 0但是0 goes into 2 ,所以devision的结果是0而提醒是0。

它与Operator Precedence有关,也就是Java解释器评估运算符的顺序。

请参阅此处了解文档。 一个有用的首字母缩写词是BUDMASRELCA- B球拍, U nary, D iv- M ultiplication(实际上是乘法,因为它包括模数), A ddittion- S ubtraction, R elational, E quality,Logical, C onditional(ternary), A ssignment。 我错过了Bitwise运算符,但它们可以在Logical下分组,并且它们优先于普通的逻辑运算符。

0%2!= 0首先计算为0%2(乘法),然后用!= 0计算结果0(相等)

在内部,编译器构建一个二进制表达式树来表示如下所示的顺序,使用运算符作为根和叶作为值或其他运算符(在递归情况下)。 因此,在根运算符的值可以使用它的叶子值进行求值之前,需要对具有运算符的子树进行求值。

  != / \ % 0 /\ 0 2