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

时间:2012-05-09 06:56:23

标签: java boolean zero modulus

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

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

6 个答案:

答案 0 :(得分:26)

有两个步骤:

  • 0 % 2评估为0

  • 0 != 0评估为false

详细说明第一步,JLS defines %运算符如下:

  

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

0除以2之外的其余部分为0,而不是2。您似乎认为。

答案 1 :(得分:3)

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

因此0 % 20

答案 2 :(得分:3)

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

你只是误解了模数。

答案 3 :(得分:1)

我认为你混淆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,没有休息,因此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

答案 4 :(得分:0)

  

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

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

答案 5 :(得分:0)

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

有关文档,请参阅here。一个有用的首字母缩写是BUDMASRELCA - B 球拍, U nary, D iv- M ultiplication(实际上是乘法的,因为它包括modulo), A ddittion- S ubtraction, R elational, E 质量, L ogical,<强> C 条件型(三元),的 A ssignment。 我错过了Bitwise运算符,但它们可以归入Logical,它们优先于普通的逻辑运算符。

首先将

0%2!= 0评估为0%2(乘法),然后使用!= 0评估其结果0(相等)

在内部,编译器构建一个二进制表达式树来表示如下所示的顺序,使用运算符作为根和叶作为值或其他运算符(在递归情况下)。因此,需要先评估具有运算符的子树,然后才能使用它的值来评估根运算符。

  !=
 / \
%   0
/\
0  2